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 2013

1
はい、実際には、以前のサイズの値を上書きしています。
Akshay Vishnoi

3
あなたは、省略することができますlocals。そうのような短いバージョンを使用してハッシュを<%= render @users, size: 30 %>
ペドロADAMEベルガラ

177

PartialRenderのRails APIから:

デフォルトのケースのレンダリング

コレクションやレイアウトなどのオプションを使用しない場合は、renderの省略形のデフォルトを使用してパーシャルをレンダリングすることもできます。

例:

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

したがって、ローカル変数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
2番目のレンダリングは、地元住民のいないもので、私の命を救いました。ありがとう
cassioscabral 2014年

6

どちらか

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

または

render 'user', size: 30

使用するにはlocals、あなたが必要partialです。partial引数なしで、変数を直接リストすることができます(内ではありませんlocals


5

localsRails 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.