Rails 4-将变量传递给局部


125

我正在关注Ruby on Rails教程,并在尝试将变量传递给局部变量时遇到了一个问题。

我的_user部分如下

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

我想输入一个数字作为大小值。我正在尝试如下,没有任何运气。

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

Answers:


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
是的,实际上,您是在覆盖先前的size值。
Akshay Vishnoi

3
您可以省略locals哈希来使用简短版本,例如:<%= render @users, size: 30 %>
Pedro Adame Vergara

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
第二个渲染,一个没有当地人的场景,挽救了我的生命。谢谢
cassioscabral 2014年

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

您可以在局部上调用render函数后就可以创建局部变量,因此,如果您要自定义局部,则可以通过以下方式渲染局部_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%>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.