Schienen 4 - Variable an Teil übergeben

125

Ich folge dem Ruby on Rails-Tutorial und bin beim Versuch, Variablen an Partials zu übergeben, auf ein Problem gestoßen.

Mein _userTeil ist wie folgt

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

Ich möchte eine Zahl für den Größenwert übergeben. Ich versuche wie folgt ohne Glück.

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

Antworten:

162

Sie benötigen die vollständige Render-Teilsyntax, wenn Sie Einheimische übergeben

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

Wird

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

Oder um die neue Hash-Syntax zu verwenden

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

Was ich für viel lesbarer halte

jamesc
quelle
Danke @jamesw, aber die Bilder haben immer noch die Größe 52. Liegt es daran, dass ich die Größe im Teil explizit auf 52 gesetzt habe?
Dopplesoldner
1
Ja, Sie überschreiben den vorherigen Größenwert.
Akshay Vishnoi
3
Sie können den localsHash weglassen , um die Kurzversion wie folgt zu verwenden:<%= render @users, size: 30 %>
Pedro Adame Vergara
177

Aus der Rails-API auf PartialRender :

Rendern des Standardfalls

Wenn Sie keine der Optionen wie Sammlungen oder Layouts verwenden, können Sie auch die kurzen Standardeinstellungen von Rendern verwenden, um Partials zu rendern.

Beispiele:

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

Sie können also eine lokale Variable übergeben size, um Folgendes zu rendern:

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

und dann verwenden Sie es im _user.html.erbTeil:

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

Beachten Sie, dass dies size: sizeäquivalent zu ist :size => size.

Karim Sonbol
quelle
14
Der zweite Render, der ohne Einheimische, hat mir das Leben gerettet. Danke
Cassioscabral
6

Entweder

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

Oder

render 'user', size: 30

Zur Verwendung localsbenötigen Sie partial. Ohne das partialArgument können Sie Variablen einfach direkt auflisten (nicht innerhalb locals)

Mirror318
quelle
5

Nicht localsin Rails 4.2+ verwenden

In Rails 4.2 musste ich das localsTeil entfernen und size: 30stattdessen einfach verwenden . Andernfalls würde die lokale Variable nicht korrekt übergeben.

Verwenden Sie zum Beispiel Folgendes:

<%= render @users, size: 30 %>
Joshua Pinter
quelle
3

Wenn Sie zum Rendern JavaScript verwenden, verwenden Sie escape_JavaScript("<%=render partial: partial_name, locals=>{@newval=>@oldval}%>");

Apoorv
quelle
1

Syntaktisch etwas anders, aber meiner Meinung nach sieht es sauberer aus:

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" }
Alexander Luna
quelle
1

Sie können lokale Variablen erstellen, sobald Sie die Renderfunktion für einen Teil aufrufen. Wenn Sie also einen Teil anpassen möchten, können Sie den Teil beispielsweise rendern, _form.html.erbindem Sie:

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

Auf diese Weise können Sie teilweise auf die Beschriftung für die Schaltfläche und die URL zugreifen. Diese unterscheiden sich, wenn Sie versuchen, einen Datensatz zu erstellen oder zu aktualisieren. Schließlich müssen Sie für den Zugriff auf diese lokalen Variablen Ihren Code eingeben 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%>
Carlos
quelle