Rel 4 - meneruskan variabel ke parsial

125

Saya mengikuti tutorial Ruby on Rails dan menemukan masalah saat mencoba meneruskan variabel ke parsial.

_userParsial saya adalah sebagai berikut

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

Saya ingin memasukkan angka untuk nilai ukuran. Saya mencoba sebagai berikut tanpa hasil.

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

Jawaban:

162

Anda memerlukan sintaks parsial render lengkap jika Anda meneruskan lokal

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

Menjadi

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

Atau untuk menggunakan sintaks hash baru

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

Yang menurut saya jauh lebih mudah dibaca

jamesc
sumber
Terima kasih @jamesw, Tapi gambar masih berukuran 52. Apakah karena saya menyetel ukuran 52 secara parsial?
dopplesoldner
1
Ya sebenarnya, Anda mengganti nilai ukuran sebelumnya.
Akshay Vishnoi
3
Anda dapat menghilangkan localshash untuk menggunakan versi pendek seperti ini:<%= render @users, size: 30 %>
Pedro Adame Vergara
177

Dari api Rails di PartialRender :

Merender kasus default

Jika Anda tidak akan menggunakan opsi apa pun seperti koleksi atau tata letak, Anda juga dapat menggunakan default singkat render untuk membuat parsial.

Contoh:

# 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 %>

Jadi, Anda bisa menggunakan pass variabel lokal sizeuntuk merender sebagai berikut:

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

dan kemudian gunakan secara _user.html.erbparsial:

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

Perhatikan bahwa size: sizeitu setara dengan :size => size.

Karim Sonbol
sumber
14
Render kedua, yang tanpa penduduk setempat, menyelamatkan hidup saya. Terima kasih
cassioscabral
6

Antara

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

Atau

render 'user', size: 30

Untuk menggunakan locals, Anda membutuhkan partial. Tanpa partialargumen, Anda dapat mencantumkan variabel secara langsung (tidak di dalam locals)

Mirror318
sumber
5

Jangan gunakan localsdi Rails 4.2+

Di Rails 4.2 saya harus menghapus localsbagian tersebut dan hanya menggunakan size: 30sebagai gantinya. Jika tidak, variabel lokal tidak akan diteruskan dengan benar.

Misalnya, gunakan ini:

<%= render @users, size: 30 %>
Joshua Pinter
sumber
3

Jika Anda menggunakan JavaScript untuk merender, gunakan escape_JavaScript("<%=render partial: partial_name, locals=>{@newval=>@oldval}%>");

Apoorv
sumber
1

Secara sintaksis sedikit berbeda tetapi menurut saya terlihat lebih bersih:

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" }
Alexander Luna
sumber
1

Anda dapat membuat variabel lokal setelah Anda memanggil fungsi render secara parsial, oleh karena itu jika Anda ingin menyesuaikan sebagian, Anda dapat, misalnya, membuat parsial _form.html.erbdengan:

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

Dengan cara ini Anda dapat mengakses sebagian ke label untuk tombol dan URL, keduanya berbeda jika Anda mencoba membuat atau memperbarui catatan. terakhir, untuk mengakses variabel lokal ini Anda harus memasukkan kode Anda 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%>
Carlos
sumber