rails: pass variable to partial - ruby-on-rails

How can I pass a variable to a partial using this code? :
<%= render #performance_indicator.improvement_actions.order("created_at DESC") %>
I want to pass "id=1" and then in _improvement_action, use that variable like:
<%= id %>
EDIT:
This is my improvement_action partial:
https://gist.github.com/luisamaro0/6597084f2de1dc33cde7c014ea9f23a5

You can pass a local variable like so:
render "a_partial", :a_local_variable => whatever, :another_variable => another
See this question for more details: Rails 3, passing local variable to partial

you can pass a variable like this
<%= render partial: 'partial_name', locals: {id: '1'} %>

Try this syntax out:
<%= render #performance_indicator.improvement_actions, locals: { local_variable: 1 %>
# then <%= local_variable %>

Related

Can you pass extra variables when rendering a collection in Rails?

I've been using this pattern a lot in a recent project:
<%= render partial: 'path/to/partial', collection: #crowd, as: :person %>
What I'm wondering if it's possible to set another local variable using the same syntax (rather than eg falling back on an explicit #crowd.each loop), so that it would look something like this:
<%= render partial: 'path/to/partial', collection: #crowd, as: :person, day: 'Thursday' %>
(the above doesn't err, but just doesn't assign day in the relevant partial)
There's locals for that:
render partial: 'some_partial', collection: #collection, as: :item_name, locals: { variable_name: 'value', other_variable: 123 }

Render partial with locals inside a form_for tag

I have this form (simplified)
<%= form_for #client do |client| %>
<%= render "some_partial", foo: 10, bar: 20 %>
<% end %>
I also try with: <%= render :partial => "some_partial", :locals => {foo: 10, bar: 20} %>
And in some_partial:
<%= foo %>
<%= bar %>
But, the variables are not available on partial:
undefined local variable or method `foo' for #<#<Class:0x007fb35027bbd0>:0x007fb350536e60>
If I put render out side of form_tag works fine
Thanks in advance
UPDATE1: At the end of form, I have this:
<%= link_to_add_association 'Add', client, :client_addresses, class: "ui mini green button add_client_address" %>
If I remove this part, works fine...
You have to mention parameters as locals, like this.
<%= render :partial => "some_partial", :locals => {foo: 10, bar: 20} %>
Is the "some_partial" the same :client_addresses you are trying to load with the link_to_add_association?
I believe that the error message you are experiencing is coming from within the link_to_add_association
Seems you are using the Cocoon gem. In order to pass locals into the partial that Cocoon uses (:client_addresses in your case) you need to pass the parameter render_options: { locals: {foo: bar} for the link_to_add_association

How to render a form partial in Rails 4?

undefined local variable or method `f' for #<#:0x000001080edfe0>
I am trying to render a form within a template page with:
<%= form_for #vehicle, html: { class: "f_grp" }, remote: true do |f| %>
<%= render "vehicles", locals: { f: f } %>
<% end %>
The file is loading. But I'm getting an undefined method on f error. Any ideas?
You only use :locals when you use :partial.
Either of these are correct:
<%= render partial: 'vehicles', locals: { f: f } %>
Or (as of Rails 2.3):
<%= render 'vehicles', f: f %>
Your version, which combines both, creates a local called locals and sets its value to a hash containing f: FormBuilder....
It's worth noting that the only reason to still use locals: is when you use render :collection.

Rails passing form_for object to partial

I would like to pass the form_for object to a partial:
<%= form_for #price do |f| %>
...
<%= render :partial => "price_page", :object => #price, :as => :f %>
...
<% end %>
When I call:
f.radio_button
Brings the error:
undefined method `radio_button' for #<Price:0x3cb1ed0>
How can I use f as I usually would in this partial?
Try passing form object as local
<%= render :partial => "price_page", :locals=>{:f=>f} %>
You can pass form builder object as a local variable like below,
<%= form_for #price do |f| %>
<%= render :partial => "price_page", :locals => { :f => f } %>
<% end %>
in your partial file you will be receiving form builder as a local variable "f", you can use like below,
<% f.radio_button, {} %>
I ran across this question trying to figure out how to get a form builder into a partial without an additional form tag. That's the primary use case I could think of for this question, so I'm adding this answer for future visitors.
To solve my problem, I have my form_for in my layout and I render my partial passing only the model. In my partial I use fields_for.
Looks (something) like this:
= form_for #price do |f|
...
= render partial: "price_page", object: #price, as: 'price %>
...
Then, my partial has this:
= fields_for price do |f|
...

Pass Parameters in render - Rails 3

I've seen a couple questions on this but haven't been able to solve it...
I'm trying to pass a parameter while rendering a partial (similar to domainname.com/memory_books/new?fbookupload=yes)
Right now, I use this line:
<%= render :partial => '/memory_books/new', :fbookupload => "yes" %>
and in the partial, I have tried to get the content of fbookupload by using:
<%= fbookupload %>
which gives an "undefined local variable" error and
<%= params.inspect %>
which does not show fbookupload as a parameter.
How can I have the partial pass along the parameter :fbookupload?
Thank you.
UPDATE:
Could it have anything to do with the fact that I'm rendering this within a render?
i.e. the page (/fbookphotos/show) that has
<%= render :partial => '/memory_books/new', :fbookupload => "yes" %>
is being rendered by another page with (posts/show) via:
<%= render :partial => '/fbookphotos/show' %>
so I'm rendering this within a render.
try this:
<%= render :partial => '/memory_books/new', :locals => {:fbookupload => "yes"} %>
Taking it out of the comments for posterity. This syntax is correct:
render '/memory_books/new', fbookupload: "yes"
But if there is a reference to rendering the same partial without specifying the local variables, e.g.
render '/memory_books/new'
then fbookupload variable becomes unavailable. The same applies to multiple local variables, e.g.
render 'my_partial', var1: 'qq', var2: 'qqq'
will work if only occurs once. But if there is something like that somewhere else in the code
render 'my_partial', var1: 'qq'
then the var2 will become unavailable. Go figure ...
To do it your way:
In the main view:
<% fbookupload = "yes" %>
<%= render :partial => '/memory_books/new', :locals => {:fbookupload => fbookupload} %>
And in the partial:
<%= fbookupload %>
2nd option:
Ideally in the controller, otherwise in the view, define an instance variable: #fbookupload = "yes". Then it is available everywhere. The partial will then be : <%= #fbookupload %>
Params is just request parameter, so if u want to pass it in params u have to add it to your url ?fbookupload=yes or assign it params[:fbookupload] = "yes", but i don't think that is a good idea.
But if u need to use params[:fbookupload]', u can replace it withparams[:fbookupload] || fbookupload', and pass fbookupload in locals hash for partial.
render can be called with or without the partial param, and there seems to be some confusion around the differences between these two forms.
The following two are equivalent:
<%= render "my_partial', my_param: true %>
and:
<%= render partial: "my_partial', locals: { my_param: true } %>
The first is a shorthand that allows you to omit partial:. With this shorthand, local variables are also not nested under locals:. This is explained well in the documentation (see 'Rendering the default case').
In the two cases above, you would access my_param in the partial directly with my_param.
One other source of confusion is that if you render the partial somewhere without passing my_param, then the partial will fail when it tries to access it. To get around this, you can access the local with local_assigns[:my_param] instead of my_param, which will give you nil if the param is not defined instead of erroring, as described in this documentation. Another alternative is to use defined?(my_param) before accessing it.

Resources