Rails 4 - ส่งผ่านตัวแปรไปยังบางส่วน


125

ฉันกำลังติดตามบทช่วยสอน Ruby on Rails และพบปัญหาขณะพยายามส่งผ่านตัวแปรไปยังบางส่วน

_userบางส่วนของฉันมีดังนี้

<li>
  <%= gravatar_for user, size: 52 %>
  <%= link_to user.name, user %>
</li>

ฉันต้องการส่งตัวเลขสำหรับค่าขนาด ฉันกำลังพยายามดังต่อไปนี้โดยไม่มีโชค

<%= render @users, :locals => {:size => 30} %>

คำตอบ:


162

คุณต้องใช้ไวยากรณ์บางส่วนในการแสดงผลแบบเต็ม

<%= render @users, :locals => {:size => 30} %>

กลายเป็น

<%= render :partial => 'users', :collection => @users, :locals => {:size => 30} %>

หรือใช้ไวยากรณ์แฮชใหม่

<%= render partial: 'users', collection: @users, locals: {size: 30} %>

ซึ่งผมคิดว่าน่าอ่านกว่ามาก


ขอบคุณ @jamesw แต่ภาพยังคงมีขนาด 52 เป็นเพราะฉันตั้งขนาดไว้ที่ 52 อย่างชัดเจนในบางส่วนหรือไม่?
dopplesoldner

1
ใช่คุณกำลังลบล้างค่าขนาดก่อนหน้านี้
Akshay Vishnoi

4
คุณสามารถละเว้นlocalsแฮชเพื่อใช้เวอร์ชันสั้นเช่นนี้ได้:<%= render @users, size: 30 %>
Pedro Adame Vergara

177

จาก Rails api บนPartialRender :

การแสดงกรณีเริ่มต้น

หากคุณจะไม่ใช้ตัวเลือกใด ๆ เช่นคอลเลกชันหรือเลย์เอาต์คุณยังสามารถใช้ค่าเริ่มต้นแบบสั้นของการเรนเดอร์เพื่อแสดงผลบางส่วน

ตัวอย่าง:

# Instead of <%= render partial: "account" %>
<%= render "account" %>

# Instead of <%= render partial: "account", locals: { account: @buyer } %>
<%= render "account", account: @buyer %>

# @account.to_partial_path returns 'accounts/account', so it can be used to replace:
# <%= render partial: "accounts/account", locals: { account: @account} %>
<%= render @account %>

# @posts is an array of Post instances, so every post record returns 'posts/post' on `to_partial_path`,
# that's why we can replace:
# <%= render partial: "posts/post", collection: @posts %>
<%= render @posts %>

ดังนั้นคุณสามารถใช้ pass ตัวแปรภายในsizeเพื่อแสดงผลได้ดังนี้:

<%= render @users, size: 50 %>

จากนั้นใช้ใน_user.html.erbบางส่วน:

<li>
    <%= gravatar_for user, size: size %>
    <%= link_to user.name, user %>
</li>

โปรดทราบว่าsize: sizeเทียบเท่ากับ:size => size.


14
เรนเดอร์ที่สองซึ่งไม่มีชาวบ้านช่วยชีวิตฉันไว้ ขอบคุณ
cassioscabral

6

ทั้ง

render partial: 'user', locals: {size: 30}

หรือ

render 'user', size: 30

กับการใช้งานคุณจะต้องlocals partialหากไม่มีpartialอาร์กิวเมนต์คุณสามารถแสดงรายการตัวแปรได้โดยตรง (ไม่ใช่ภายในlocals)


5

อย่าใช้localsใน Rails 4.2+

ใน Rails 4.2 ฉันต้องถอดชิ้นlocalsส่วนออกและใช้size: 30แทน มิฉะนั้นจะไม่ส่งผ่านตัวแปรท้องถิ่นอย่างถูกต้อง

ตัวอย่างเช่นใช้สิ่งนี้:

<%= render @users, size: 30 %>

3

หากคุณใช้ JavaScript เพื่อแสดงผลให้ใช้ escape_JavaScript("<%=render partial: partial_name, locals=>{@newval=>@oldval}%>");


1

ความแตกต่างทางคำพูดเล็กน้อย แต่มันดูสะอาดกว่าในความคิดของฉัน:

render 'my_partial', locals: { title: "My awesome title" }

# not a big fan of the arrow key syntax
render 'my_partial', :locals => { :title => "My awesome title" }

1

คุณสามารถสร้างตัวแปรโลคัลได้เมื่อคุณเรียกใช้ฟังก์ชันการแสดงผลในบางส่วนดังนั้นหากคุณต้องการปรับแต่งบางส่วนคุณสามารถสร้างการแสดงผลบางส่วน_form.html.erbโดย:

<%= render 'form', button_label: "Create New Event", url: new_event_url %>
<%= render 'form', button_label: "Update Event", url: edit_event_url %>

ด้วยวิธีนี้คุณสามารถเข้าถึงป้ายกำกับบางส่วนสำหรับปุ่มและ URL ซึ่งจะแตกต่างกันหากคุณพยายามสร้างหรืออัปเดตระเบียน สุดท้ายสำหรับการเข้าถึงตัวแปรท้องถิ่นนี้คุณต้องใส่รหัสของคุณlocal_assigns[:button_label]( local_assigns[:name_of_your_variable])

<%=form_for(@event, url: local_assigns[:url]) do |f|  %>
<%= render 'shared/error_messages_events' %>
<%= f.label :title ,"Title"%>
  <%= f.text_field :title, class: 'form-control'%>
  <%=f.label :date, "Date"%>
  <%=f.date_field :date, class: 'form-control'  %>
  <%=f.label :description, "Description"%>
  <%=f.text_area :description, class: 'form-control'  %>
  <%= f.submit local_assigns[:button_label], class:"btn btn-primary"%>
<%end%>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.