I have the following collection rendering code:
<%= render partial: 'product_models/attr_val',
collection: attr_vals.sort_by {|attr_val| attr_val.name},
as: :attr_val,
locals: {input_type: "checkbox",
is_input_checked: checked_attr_vals_ids.include?(WHAT_TO_PUT_HERE.id),
is_input_disabled: true} %>
Is there any way I can reference the current object (attr_val) in the locals? If it is possible, what should I replace WHAT_TO_PUT_HERE with?
Related
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 }
I am trying to render a partial of a collection using a name different to that of the model:
<%= render "current_campaigns", collection: #current_campaigns, as: :current_campaign %>
The model is called Campaign but this is a subset of campaigns as defined in the controller action:
def index
#current_campaigns = Campaign.where(status: :approved)
end
In the partial (which lives in the application directory not the campaigns directory):
<%= current_campaign.question %>
The resulting error:
undefined local variable or method `current_campaign' for #<#<Class:0x007fad3d5e5500>:0x007fad451976a8>
I was under the impression that as would make this work but apparently not. Any thoughts?
Try the following
<%= render partial: 'path-relative-to-views/current_campaigns', collection: #current_campaigns, as: :current_campaign %>
And the partial should name _current_campaign.html.erb for convention.
The most simple way to pass attributes to the partial using a custom name is:
<%= render "current_campaigns", custom_name: #current_campaigns %>
doing this you will be able to use custom_name as a defined variable on your partial.
Try to rename campaigns/current_campaigns.html.erb template to campaigns/campaign.html.erb and render like that from campaigns/:
<%= render #current_campaigns %>
Otherwise you can specify name of directory where the partial is:
<%= render "other_folder_name/campaign", collection: #current_campaigns %>
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 %>
I am trying to render a partial from within a js.erb file which has both a collection AND a local variable passed to it. Everything works fine except I cannot access the local variable in the view. I have tried the following:
<%= escape_javascript(render(partial: 'tasks/task', collection: #task_group.tasks_belonging_to, as: :task, locals: {testvble: "bob"})) %>
<%= escape_javascript(render(partial: 'tasks/task', collection: #task_group.tasks_belonging_to, locals: {testvble: "bob"})) %>
<%= escape_javascript(render(partial: #task_group.tasks_belonging_to, locals: {testvble: "bob"})) %>
<%= escape_javascript(render(#task_group.tasks_belonging_to, testvble: "bob")) %>
Each of the above works until I try to access the local variable in the view. I get the error:
undefined local variable or method `testvble'
Just for completeness, each of the above is inside the following statement in the js.erb file (at the xxxx position):
$("#task-group-<%=#task_group.id%>").append("xxxx").hide().show('slow')
This is the code in the partial causing the issue:
<p>should be bob:<%= testvble %></p>
The bottom syntax is actually correct as suggested by J Plato. My issue was that the partial recursively called itself if there were child tasks to display. When rendering the child task(s) the local variable was not being passed on.
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.