Rails 4 - 将变量传递给局部视图

136

我正在跟随 Ruby on Rails 的教程,尝试将变量传递到局部视图时遇到了问题。

我的 _user 局部视图如下:

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

我想传递一个数字作为尺寸值。我尝试了以下方法,但没有成功。

<%= render @users, :locals => {:size => 30} %>
7个回答

187

来自Rails api关于PartialRender的介绍:

渲染默认情况

如果您不会使用任何选项,例如collections或layouts等选项,则还可以使用render的简写默认值来渲染partials。

示例:

# 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是等价的。

15
第二个渲染(没有本地变量的那个),救了我的命。谢谢。 - Cassio Cabral
这个速记法在Rails指南中没有提到,这让人感到非常困惑。几乎像是他们想要隐藏它一样。 - lulalala

180

如果您要传递本地变量,您需要完整的渲染部分语法。

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

或者使用新的哈希语法。

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

我认为这更易读。


谢谢@jamesw,但是图片仍然是52大小。这是因为我在partial中明确设置了大小为52吗? - dopplesoldner
1
是的,实际上你正在覆盖先前的 size 值。 - Akshay Vishnoi
9
您可以省略locals哈希表,使用简写形式,如下所示:<%= render @users, size: 30 %> - Pedro Adame Vergara

11

无论是

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

或者

render 'user', size: 30

要使用locals,您需要使用partial。没有partial参数,您只能直接列出变量(不在locals内)。


这是2023年的答案! - Bergrebell
这是2023年的答案! - Bergrebell

5

不要在Rails 4.2+中使用locals

在Rails 4.2中,我必须删除locals部分,只需使用size: 30即可。否则,它将无法正确传递局部变量。

例如,使用以下内容:

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

3
简要说明一下。如果出于某种原因需要指定 partial 关键字,例如使用不匹配部分的对象数组时,仍然需要使用 locals。但是当使用这种简写方式时,必须省略 locals 关键字。 - Joshua Pinter

2
如果您正在使用JavaScript进行渲染,则使用escape_JavaScript("<%=render partial: partial_name, locals=>{@newval=>@oldval}%>");

2

当您在部分调用render函数时,可以创建局部变量,因此如果您想自定义部分,则可以例如通过以下方式呈现partial _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[: your_variable_name]

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

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" }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接