Rails 4 - truyền biến cho một phần


125

Tôi đang làm theo hướng dẫn của Ruby on Rails và đã gặp phải một vấn đề trong khi cố gắng chuyển các biến cho các phần.

Một _userphần của tôi là như sau

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

Tôi muốn chuyển qua một số cho giá trị kích thước. Tôi đang cố gắng như sau mà không gặp may mắn.

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

Câu trả lời:


162

Bạn cần cú pháp kết xuất hoàn toàn một phần nếu bạn chuyển qua địa phương

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

Trở thành

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

Hoặc để sử dụng cú pháp băm mới

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

Mà tôi nghĩ là dễ đọc hơn nhiều


Cảm ơn @jamesw, nhưng hình ảnh vẫn có kích thước 52. Có phải vì tôi có kích thước được đặt thành 52 rõ ràng trong một phần không?
dopplesoldner

1
Có thực sự, bạn đang ghi đè giá trị trước đó của kích thước.
Akshay Vishnoi

3
Bạn có thể bỏ localsbăm để sử dụng phiên bản ngắn như vậy:<%= render @users, size: 30 %>
Pedro Adame Vergara

177

Từ api Rails trên PartialRender :

Hiển thị trường hợp mặc định

Nếu bạn sẽ không sử dụng bất kỳ tùy chọn nào như bộ sưu tập hoặc bố cục, bạn cũng có thể sử dụng mặc định kết xuất ngắn để kết xuất các phần.

Ví dụ:

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

Vì vậy, bạn có thể sử dụng vượt qua một biến cục bộ sizeđể kết xuất như sau:

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

và sau đó sử dụng nó trong _user.html.erbmột phần:

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

Lưu ý rằng size: sizetương đương với :size => size.


14
Kết xuất thứ hai, một người không có người địa phương, đã cứu mạng tôi. Cảm ơn
cassioscabral

6

Hoặc

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

Hoặc là

render 'user', size: 30

Để sử dụng locals, bạn cần partial. Nếu không có partialđối số, bạn chỉ có thể liệt kê các biến trực tiếp (không nằm trong locals)


5

Không sử dụng localstrong Rails 4.2+

Trong Rails 4.2 tôi đã phải loại bỏ localsmột phần và chỉ sử dụng size: 30thay thế. Nếu không, nó sẽ không vượt qua biến cục bộ một cách chính xác.

Ví dụ: sử dụng cái này:

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

3

Nếu bạn đang sử dụng JavaScript để kết xuất thì hãy sử dụng escape_JavaScript("<%=render partial: partial_name, locals=>{@newval=>@oldval}%>");


1

Cú pháp khác một chút nhưng theo tôi thì có vẻ sạch sẽ hơn:

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

Bạn có thể tạo các biến cục bộ sau khi bạn gọi hàm kết xuất trên một phần, do đó nếu bạn muốn tùy chỉnh một phần, ví dụ bạn có thể kết xuất một phần _form.html.erbbằng cách:

<%= render 'form', button_label: "Create New Event", url: new_event_url %>
<%= render 'form', button_label: "Update Event", url: edit_event_url %>

bằng cách này, bạn có thể truy cập một phần vào nhãn cho nút và URL, những cách này khác nhau nếu bạn cố gắng tạo hoặc cập nhật bản ghi. cuối cùng, để truy cập vào các biến cục bộ này, bạn phải đặt mã của mình 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%>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.