ใน Rails คุณสร้าง JSON โดยใช้มุมมองอย่างไร


125

สมมติว่าคุณอยู่ในตัวควบคุมผู้ใช้ของคุณและคุณต้องการได้รับการตอบกลับ json สำหรับคำขอการแสดงคงจะดีถ้าคุณสามารถสร้างไฟล์ในมุมมอง / ผู้ใช้ / dir ของคุณชื่อ show.json และหลังจากผู้ใช้ของคุณ # show การดำเนินการเสร็จสิ้นจะแสดงไฟล์

ขณะนี้คุณต้องทำบางสิ่งตามแนวของ:

def show
  @user = User.find( params[:id] )
  respond_to do |format|
    format.html
    format.json{
      render :json => @user.to_json
    }
  end
end

แต่คงจะดีถ้าคุณสามารถสร้างไฟล์ show.json ซึ่งจะแสดงผลโดยอัตโนมัติดังนี้:

def show
  @user = User.find( params[:id] )
  respond_to do |format|
    format.html
    format.json
  end
end

สิ่งนี้จะช่วยให้ฉันหายเศร้าได้มากมายและจะล้างความรู้สึกสกปรกอย่างน่ากลัวที่ฉันได้รับเมื่อฉันแสดง json ในคอนโทรลเลอร์


ดูโพสต์นี้ตอนนี้ดูเหมือนว่าจะไม่ช่วยฉันได้มากนัก แต่ฉันมีคดีที่ซับซ้อนกว่านี้เชื่อฉันเถอะเมื่อฉันพูดสิ่งนี้ทำให้ฉันปวดหัว
Matthew

1
ใน Rails 3 คุณสามารถโทรformat.jsonด้วยshow.json.erbไฟล์ได้ ดูคำตอบของฉัน
James Lim

คำตอบ:


64

คุณควรจะทำสิ่งนี้ได้ในrespond_toบล็อกของคุณ:

respond_to do |format|
    format.json 
    render :partial => "users/show.json"
end

ซึ่งจะแสดงเทมเพลตในรูปแบบapp/views/users/_show.json.erb.


5
นี่เป็นสิ่งที่ดี แต่คุณจะพบว่า erb เป็นวิธีที่เจ็บปวดในการสร้าง json ตรวจสอบคำตอบของฉันสำหรับทางเลือกอื่น ๆ
tybro0103

1
มีวิธีใดบ้างที่จะทำได้โดยไม่ต้องใช้บางส่วน?
Wylliam Judd

55

ลองเพิ่มมุมมองusers/show.json.erbสิ่งนี้ควรแสดงผลเมื่อคุณร้องขอรูปแบบ JSON และคุณจะได้รับประโยชน์เพิ่มเติมจากการแสดงผลโดย erb ด้วยดังนั้นไฟล์ของคุณอาจมีลักษณะเช่นนี้

{
    "first_name": "<%= @user.first_name.to_json %>",
    "last_name": "<%= @user.last_name.to_json %>"
}

9
คุณอาจต้องการใช้@user.first_name.to_jsonแทนescape_javascript. มีความแตกต่างเล็กน้อยระหว่างสิ่งที่ JS อนุญาตและสิ่งที่เป็นJSON อย่างเคร่งครัด (และความแตกต่างเหล่านั้นกำลังมีความสำคัญเมื่อเบราว์เซอร์ใช้ตัวแยกวิเคราะห์ JSON ของตัวเอง)
James A. Rosen

1
คุณควรเปลี่ยนเครื่องหมายคำพูดเดี่ยวเป็นเครื่องหมายคำพูดคู่เนื่องจาก JSON (ไม่เหมือน JS) ยอมรับเฉพาะสตริงที่ยกมาสองครั้ง
Abe Voelker

1
นี่เป็นสิ่งที่ดี แต่คุณจะพบว่า erb เป็นวิธีที่เจ็บปวดในการสร้าง json ตรวจสอบคำตอบของฉันสำหรับทางเลือกอื่น ๆ
tybro0103

ฉันรู้ว่านี่เป็นคำตอบเก่า แต่มันผิดอย่างสิ้นเชิง to_json จะส่งคืนสตริง json ที่จัดรูปแบบ "" ไว้แล้วดังนั้น json ที่ได้จะไม่สามารถใช้ได้กับเครื่องหมายคำพูดพิเศษ ("" value "") นอกจากนี้หากชื่อผู้ใช้เป็นศูนย์ json ที่ได้จะมีสตริง "null" เป็นค่า นอกจากนี้ <% = ใช้การหลีกเลี่ยง html ซึ่งจะทำลายอักขระ html ในข้อมูลอินพุต
d4n3

ฉันคิดว่าคุณต้องลบคำพูดรอบ ๆ ออกไปด้วย<%= xyz.to_json %>มิฉะนั้นคุณจะเหลือคำพูดพิเศษ
akostadinov

32

ดังที่คนอื่น ๆ กล่าวถึงคุณต้องมีมุมมองผู้ใช้ / show.json แต่มีตัวเลือกที่ต้องพิจารณาสำหรับภาษาเทมเพลต ...

ERB

ทำงานนอกกรอบ เหมาะสำหรับ HTML แต่คุณจะพบว่ามันแย่มากสำหรับ JSON อย่างรวดเร็ว

Rabl

ทางออกที่ดี. ต้องเพิ่มการพึ่งพาและเรียนรู้ DSL

ตัวสร้าง JSON

ข้อตกลงเดียวกับ RABL: ทางออกที่ดี ต้องเพิ่มการพึ่งพาและเรียนรู้ DSL

ทับทิมธรรมดา

Ruby ยอดเยี่ยมในการสร้าง JSON และไม่มีอะไรใหม่ให้เรียนรู้เนื่องจากคุณสามารถเรียกto_jsonใช้ Hash หรือวัตถุ AR ได้ เพียงลงทะเบียนนามสกุล. rb สำหรับเทมเพลต (ในโปรแกรมเริ่มต้น):

ActionView::Template.register_template_handler(:rb, :source.to_proc)

จากนั้นสร้างมุมมองผู้ใช้ / show.json.rb:

@user.to_json

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับแนวทางนี้โปรดดูที่http://railscasts.com/episodes/379-template-handlers


7
โปรดทราบว่าในราง 4 ตัวจัดการเทมเพลต. ruby ​​ถูกลงทะเบียนโดยค่าเริ่มต้นgithub.com/rails/rails/commit/de1060f4e02925c12004f2ดังนั้นคุณสามารถข้ามการลงทะเบียน. rb และตั้งชื่อไฟล์ของคุณเป็น user / show.json.ruby
Tim Diggins

1
นอกจากนี้ในการปรับปรุงต่อไปนี้, json_builder ถูกแทนที่โดยgithub.com/rails/jbuilder
Tim Diggins

27

RABL น่าจะเป็นทางออกที่ดีที่สุดสำหรับสิ่งนี้ที่ฉันเคยเห็นหากคุณกำลังมองหาทางเลือกที่สะอาดกว่าสำหรับไวยากรณ์ ERb json_builder และ argonaut ซึ่งเป็นโซลูชันอื่น ๆ ดูเหมือนว่าค่อนข้างล้าสมัยและจะไม่ทำงานกับ Rails 3.1 หากไม่มีการแก้ไข

RABL มีให้ใช้งานผ่านอัญมณีหรือตรวจสอบที่เก็บ GitHub ตัวอย่างที่ดีเช่นกัน

https://github.com/nesquena/rabl


21

เพียงเพื่ออัปเดตคำตอบนี้เพื่อประโยชน์ของผู้อื่นที่เกิดขึ้นในหน้านี้

ใน Rails 3 คุณต้องสร้างไฟล์ที่views/users/show.json.erb. @userวัตถุจะสามารถใช้ได้กับมุมมอง (เช่นเดียวกับที่จะเป็นสำหรับ HTML.) คุณไม่จำเป็นต้องto_jsonอีกต่อไป

สรุปก็แค่

# users contoller
def show
  @user = User.find( params[:id] )
  respond_to do |format|
    format.html
    format.json
  end
end

และ

/* views/users/show.json.erb */
{
    "name" : "<%= @user.name %>"
}

1
ฉันตอบสิ่งนี้เมื่อ 1.5 ปีที่แล้ว ปัจจุบันผมใช้เพียง respond_with เมื่อใดก็ตามที่ฉันต้อง JSON respond_with @user, only: [:name]เช่น ดูบทช่วยสอนนี้สำหรับข้อมูลเพิ่มเติม
James Lim

1
เพื่อเพิ่มคำตอบนี้สิ่งนี้เป็นอันตรายจริง ๆ ด้วยเหตุผลสองประการคืออนุญาตให้มีการแทรกข้อมูลผู้ใช้เนื่องจากไม่หนีขึ้นบรรทัดใหม่และแบ็กสแลชและ <% = html จะหลบหนีข้อมูลดังนั้นเช่นฌอนโอคอนเนอร์จะมีชื่อของเขา แหลกเหลวกับ Sean O & apos; Connor
d4n3

10

เพียงเพิ่มshow.json.erbไฟล์ที่มีเนื้อหา

<%= @user.to_json %>

บางครั้งก็มีประโยชน์เมื่อคุณต้องการตัวช่วยพิเศษบางอย่างที่ไม่มีในตัวควบคุมเช่นimage_path(@user.avatar)หรือบางอย่างเพื่อสร้างคุณสมบัติเพิ่มเติมใน JSON:

<%= @user.attributes.merge(:avatar => image_path(@user.avatar)).to_json %>

8
จำเป็นต้อง<%= raw(@user.to_json) %>หลีกเลี่ยงการหลบหนี HTML สิ่งที่ฉันทำคือฉันพึ่งพา to_json ตราบเท่าที่มันให้สิ่งที่ฉันต้องการ แต่เมื่อฉันต้องการทำอย่างอื่นฉันจะใช้สิ่งที่มักจะเป็น{ :blah => @user.the_blah }.to_jsonไฟล์.
clacke


0

ฉันยังใหม่กับ RoR นี่คือสิ่งที่ฉันค้นพบ คุณสามารถแสดงรูปแบบ json ได้โดยตรง

def YOUR_METHOD_HERE
  users = User.all
  render json: {allUsers: users} # ! rendering all users
END
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.