Raylar 4 - değişkeni parçaya geçirme


125

Ruby on Rails öğreticisini takip ediyorum ve değişkenleri bölümlere aktarmaya çalışırken bir sorunla karşılaştım.

Benim _userbölümüm aşağıdaki gibidir

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

Beden değeri için bir sayı iletmek istiyorum. Şanssız şu şekilde deniyorum.

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

Yanıtlar:


162

Yerellerden geçiyorsanız tam render kısmi sözdizimine ihtiyacınız var

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

Oluyor

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

Veya yeni karma sözdizimini kullanmak için

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

Bence çok daha okunaklı


Teşekkürler @jamesw, Ama resimler hala 52 boyutunda. Kısmi olarak boyutu açıkça 52'ye ayarladığım için mi?
dopplesoldner

1
Evet aslında, önceki boyut değerini geçersiz kılıyorsunuz.
Akshay Vishnoi

3
localsKısa versiyonu şu şekilde kullanmak için hash'i atlayabilirsiniz :<%= render @users, size: 30 %>
Pedro Adame Vergara

177

PartialRender'daki Rails api'den :

Varsayılan durumu oluşturma

Koleksiyonlar veya düzenler gibi seçeneklerden herhangi birini kullanmayacaksanız, kısmi işlemleri oluşturmak için kısa el varsayılanlarını da kullanabilirsiniz.

Örnekler:

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

Dolayısıyla, sizeaşağıdaki gibi işlemek için yerel bir değişken geçirebilirsiniz :

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

ve sonra onu _user.html.erbkısmi olarak kullanın :

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

Bunun size: sizeeşdeğer olduğunu unutmayın :size => size.


14
Yerli olmayan ikinci render, hayatımı kurtardı. Teşekkürler
cassioscabral

6

ya

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

Veya

render 'user', size: 30

Kullanmak için localsihtiyacınız var partial. Bağımsız partialdeğişken olmadan, değişkenleri doğrudan listeleyebilirsiniz (içinde değil locals)


5

localsRails 4.2+ ile kullanmayın

Rails 4.2'de localsparçayı çıkarmak ve size: 30yerine kullanmak zorunda kaldım . Aksi takdirde, yerel değişkeni doğru bir şekilde aktaramaz.

Örneğin, şunu kullanın:

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

3

Oluşturmak için JavaScript kullanıyorsanız, şunu kullanın: escape_JavaScript("<%=render partial: partial_name, locals=>{@newval=>@oldval}%>");


1

Sözdizimsel olarak biraz farklı ama bence daha temiz görünüyor:

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

Bir kısmi üzerinde render işlevini çağırdığınızda yerel değişkenler yaratabilirsiniz, bu nedenle bir parçayı özelleştirmek istiyorsanız, örneğin parçayı şu şekilde oluşturabilirsiniz _form.html.erb:

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

bu şekilde, düğme ve URL için kısmi etikete erişebilirsiniz, bir kayıt oluşturmaya veya güncellemeye çalışırsanız bunlar farklıdır. son olarak, bu yerel değişkenlere erişmek için kodunuzu local_assigns[:button_label]( local_assigns[:name_of_your_variable]) girmeniz gerekir.

<%=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%>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.