【问题标题】:Rails 4 - passing variable to partialRails 4 - 将变量传递给部分
【发布时间】:2013-04-26 17:33:21
【问题描述】:

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

我的_user部分如下

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

我想传入一个数字作为尺寸值。我正在尝试如下没有任何运气。

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

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    来自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 =&gt; size

    【讨论】:

    • 第二次渲染,没有本地人的渲染,救了我的命。谢谢
    【解决方案2】:

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

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

    变成

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

    或者使用新的哈希语法

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

    我觉得更易读

    【讨论】:

    • 谢谢@jamesw,但图像的尺寸仍然是 52。是因为我在部分中明确将尺寸设置为 52?
    • 是的,实际上,您正在覆盖之前的 size 值。
    • 您可以省略 locals 哈希以使用短版本,如下所示:&lt;%= render @users, size: 30 %&gt;
    【解决方案3】:

    要么

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

    或者

    render 'user', size: 30
    

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

    【讨论】:

      【解决方案4】:

      不要在 Rails 4.2+ 中使用locals

      在 Rails 4.2 中,我不得不删除 locals 部分,只使用 size: 30 代替。否则,它不会正确传递局部变量。

      例如,使用这个:

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

      【讨论】:

      • 对此进行快速澄清。如果由于某种原因需要指定partial 键,例如使用与部分不匹配的对象数组时,您仍然需要使用locals。但是在使用这种速记方法时,您需要省略locals
      【解决方案5】:

      如果您使用 JavaScript 进行渲染,请使用 escape_JavaScript("&lt;%=render partial: partial_name, locals=&gt;{@newval=&gt;@oldval}%&gt;");

      【讨论】:

        【解决方案6】:

        您可以在对部分调用渲染函数后创建局部变量,因此如果您想自定义部分,例如可以通过以下方式渲染部分_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%>
        

        【讨论】:

          【解决方案7】:

          语法上有点不同,但我认为它看起来更干净:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-01-16
            • 2011-06-09
            • 1970-01-01
            • 2013-09-10
            • 2012-08-28
            • 1970-01-01
            • 1970-01-01
            • 2014-10-15
            相关资源
            最近更新 更多