问题
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.
回答1:
try this:
<%= render :partial => '/memory_books/new', :locals => {:fbookupload => "yes"} %>
回答2:
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 ...
回答3:
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 with
params[:fbookupload] || fbookupload', and pass fbookupload in locals hash for partial.
回答4:
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 %>
回答5:
Already answered but to confirm this works with rails 5.2:
partial call:
<%= render partial: 'some_partial', locals: { value: 'some_value' } %>
You need to explicitly add partial
, otherwise it won't work.
In the partial itself you access as a local variable
so this holds: value == 'somevalue'
.
Check rails documentation regarding partial renderers.
来源:https://stackoverflow.com/questions/11283675/pass-parameters-in-render-rails-3