Rails 4 - passing variable to partial

后端 未结 7 1354
没有蜡笔的小新
没有蜡笔的小新 2020-11-28 03:49

I am following the Ruby on Rails tutorial and have come across a problem while trying to pass variables to partials.

My _user partial is as follows

相关标签:
7条回答
  • 2020-11-28 04:02

    Either

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

    Or

    render 'user', size: 30
    

    To use locals, you need partial. Without the partial argument, you can just list variables directly (not within locals)

    0 讨论(0)
  • 2020-11-28 04:05

    Don't use locals in Rails 4.2+

    In Rails 4.2 I had to remove the locals part and just use size: 30 instead. Otherwise, it wouldn't pass the local variable correctly.

    For example, use this:

    <%= render @users, size: 30 %>
    
    0 讨论(0)
  • 2020-11-28 04:06

    If you are using JavaScript to render then use escape_JavaScript("<%=render partial: partial_name, locals=>{@newval=>@oldval}%>");

    0 讨论(0)
  • 2020-11-28 04:09

    Syntactically a little different but it looks cleaner in my opinion:

    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" }
    
    0 讨论(0)
  • 2020-11-28 04:14

    From the Rails api on PartialRender:

    Rendering the default case

    If you're not going to be using any of the options like collections or layouts, you can also use the short-hand defaults of render to render partials.

    Examples:

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

    So, you can use pass a local variable size to render as follows:

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

    and then use it in the _user.html.erb partial:

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

    Note that size: size is equivalent to :size => size.

    0 讨论(0)
  • 2020-11-28 04:15

    You need the full render partial syntax if you are passing locals

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

    Becomes

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

    Or to use the new hash syntax

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

    Which I think is much more readable

    0 讨论(0)
提交回复
热议问题