How to pass multiple locals to a nested partial - ruby-on-rails

This should be extremely straightforward and well documented, and I've done it several times, although there's something that's still killing me.
I have a structure of partials calling nested partials.
At some point one render call needs to pass an extra variable to the partial, although the rendering of the partial fails with a:
undefined local variable or method `<variable name>' for #<#<Class:....>
Here's my code for calling the render:
= f.simple_fields_for :orders do |c|
= render partial: "fields", locals: {f: c, step: f.object.step}
though this doesn't work either:
= f.simple_fields_for :orders do |c|
= render "fields", f: c, step: f.object.step
here's where the exception is raised:
f.input :quantity, input_html: {step: step}
the form_for comes from the views/lists/_form.html.haml:
= simple_form_for( #order, :html => { :multipart => true }, defaults: { input_html: { class: 'input-medium' } } ) do |f|
f is then passed to views/orders/_order_forms.html via
= render "orders/order_forms", f: f
here's the exception with trace:
ActionView::Template::Error (undefined local variable or method `step' for #<#<Class:0x007fe0479ba2b0>:0x007fe04256a930>):
application trace:
app/views/orders/_fields.html.haml:9:in `_app_views_orders__fields_html_haml___1860431911739668171_70300581339300'
app/views/orders/_order_forms.html.haml:30:in `_app_views_orders__order_forms_html_haml__2241963939037094859_70300612771460'
app/views/lists/_form.html.haml:48:in `block in _app_views_lists__form_html_haml__1669043093238943449_70300583658680'
app/views/lists/_form.html.haml:3:in `_app_views_lists__form_html_haml__1669043093238943449_70300583658680'
app/views/lists/new.html.erb:3:in `_app_views_lists_new_html_erb___1563391577928218041_70300593681100'
app/controllers/lists_controller.rb:67:in `new'
framework trace (the end of it):
actionpack (3.2.8) lib/action_view/template.rb:145:in `block in render'
activesupport (3.2.8) lib/active_support/notifications.rb:125:in `instrument'
actionpack (3.2.8) lib/action_view/template.rb:143:in `render'
actionpack (3.2.8) lib/action_view/renderer/partial_renderer.rb:265:in `render_partial'
actionpack (3.2.8) lib/action_view/renderer/partial_renderer.rb:238:in `block in render'
actionpack (3.2.8) lib/action_view/renderer/abstract_renderer.rb:38:in `block in instrument'
activesupport (3.2.8) lib/active_support/notifications.rb:123:in `block in instrument'
activesupport (3.2.8) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
activesupport (3.2.8) lib/active_support/notifications.rb:123:in `instrument'
actionpack (3.2.8) lib/action_view/renderer/abstract_renderer.rb:38:in `instrument'
actionpack (3.2.8) lib/action_view/renderer/partial_renderer.rb:237:in `render'
actionpack (3.2.8) lib/action_view/renderer/renderer.rb:41:in `render_partial'
actionpack (3.2.8) lib/action_view/helpers/rendering_helper.rb:27:in `render'
haml (4.0.3) lib/haml/helpers/action_view_mods.rb:10:in `block in render_with_haml'
haml (4.0.3) lib/haml/helpers.rb:89:in `non_haml'
haml (4.0.3) lib/haml/helpers/action_view_mods.rb:10:in `render_with_haml'
cocoon (1.2.0) lib/cocoon/view_helpers.rb:40:in `block in render_association'
I've had a similar issue before and I resolved it in simplifying the passing of locals.. but now I would really like to understand what's going on.
any clue?
I'm using:
ruby 2.0.0p297
rails 3.2.8
Thanks a lot in advance..
UPDATE
I have debugged my view and figured that the order_forms is being rendered twice, the first time step is not set, while in the second rendering it is set correctly.
I'm not sure why this happens, but I managed to work it around with adding the following line to my fields.html.haml.
-step = step || 1
basically I put a default value to step, in case it's not defined, so that at the first execution the rendering doesn't crash, while at the second execution it works properly.
The page looks as expected now. Although I'm thinking about the waste of resources when rendering the stuff twice.
any idea on why that happens?

After finding out that the code was run twice, I went investigating who else was running it.
and I realized that just few lines before there was the call to cocoon function link_to_add_association
of course it's not only the official render rendering the partial but also that function needs to render it.
I have added the line:
:render_options => {:locals => {:step => step }},
to my link_to_add_association function call and removed the workaround and now everything works as expected.
The more modern version analogous to this would be:
render_options: {locals: {step: step }},
a bit shorter, and looking better.

Related

In Rails, how do I override the format from the URL

I have a report that's available in HTML or PDF formats. Sometimes, I want to display an error message instead of the report. The error message should be wrapped in my application's usual layout.
This works fine if the request was for the HTML report, but if the PDF report was requested, I get "There was no default layout for MyController in #<ActionView::PathSet..."
My controller method looks like this:
def report
unless report_available?
render html: '<div class="error">Not available.</div>'.html_safe,
:status => 404, :layout => true
return
end
...
end
I've tried adding :formats => :html or :formats => [:html] to the call to render, but it has no effect. I've also tried setting params[:format] = 'html' before calling render, but that didn't help either.
How do I render a snippet of HTML using the default layout when the request was for report.pdf?
The full error message looks like:
There was no default layout for MyController in #<ActionView::PathSet:0x00007fd3b842c370 #paths=[#<ActionView::OptimizedFileSystemResolver:0x00007fd3d0776c20 #pattern=":prefix/:action{.:locale,}{.:formats,}{+:variants,}{.:handlers,}", #cache=#<ActionView::Resolver::Cache:0x7fd3d0776bf8 keys=1 queries=0>, #path="/var/www/apps/myapp/releases/1/app/views">]>
And the stack trace looks like:
actionview (5.1.6) lib/action_view/layouts.rb:420:in `_default_layout'
actionview (5.1.6) lib/action_view/layouts.rb:389:in `block in _layout_for_option'
actionview (5.1.6) lib/action_view/renderer/template_renderer.rb:94:in `resolve_layout'
actionview (5.1.6) lib/action_view/renderer/template_renderer.rb:74:in `find_layout'
actionview (5.1.6) lib/action_view/renderer/template_renderer.rb:58:in `render_with_layout'
actionview (5.1.6) lib/action_view/renderer/template_renderer.rb:50:in `render_template'
actionview (5.1.6) lib/action_view/renderer/template_renderer.rb:14:in `render'
actionview (5.1.6) lib/action_view/renderer/renderer.rb:42:in `render_template'
actionview (5.1.6) lib/action_view/renderer/renderer.rb:23:in `render'
actionview (5.1.6) lib/action_view/rendering.rb:103:in `_render_template'
actionpack (5.1.6) lib/action_controller/metal/streaming.rb:217:in `_render_template'
actionview (5.1.6) lib/action_view/rendering.rb:83:in `render_to_body'
actionpack (5.1.6) lib/action_controller/metal/rendering.rb:52:in `render_to_body'
actionpack (5.1.6) lib/action_controller/metal/renderers.rb:141:in `render_to_body'
actionpack (5.1.6) lib/abstract_controller/rendering.rb:24:in `render'
actionpack (5.1.6) lib/action_controller/metal/rendering.rb:36:in `render'
actionpack (5.1.6) lib/action_controller/metal/instrumentation.rb:44:in `block (2 levels) in render'
activesupport (5.1.6) lib/active_support/core_ext/benchmark.rb:12:in `block in ms'
/usr/local/rbenv/versions/2.4.3/lib/ruby/2.4.0/benchmark.rb:308:in `realtime'
activesupport (5.1.6) lib/active_support/core_ext/benchmark.rb:12:in `ms'
actionpack (5.1.6) lib/action_controller/metal/instrumentation.rb:44:in `block in render'
actionpack (5.1.6) lib/action_controller/metal/instrumentation.rb:87:in `cleanup_view_runtime'
activerecord (5.1.6) lib/active_record/railties/controller_runtime.rb:29:in `cleanup_view_runtime'
actionpack (5.1.6) lib/action_controller/metal/instrumentation.rb:43:in `render'
app/controllers/my_controller.rb:809:in `report'
I believe the problem is that it's looking for a layout with .pdf.erb instead of .html.erb, but I don't know how to change that.
What you need to do is redirect to 404 page with this as a flash notice.
If you don't have a 404 page, you'd need one anyway.
You have to set the request format of your action:
def report
request.format = :html
# ..
end
You can also use it in a before_action filter
class ApplicationController < ActionController::Base
before_action :set_default_response_format
protected
def set_default_response_format
request.format = :html
end
end

Forgot password error in Rails 4.2 with devise

I migrated my devise version from 1.4.9 to 4.2.0. In the sessions/new form, I am also using passwords/new in a modal. I am facing error when I run the sessions new form. Please help:
This is the error stack:
ArgumentError - wrong number of arguments (given 3, expected 0..1):
bartt-ssl_requirement (1.4.2) lib/url_for.rb:9:in
url_for_with_secure_option' actionpack (4.2.6)
lib/action_dispatch/routing/route_set.rb:280:incall' actionpack
(4.2.6) lib/action_dispatch/routing/route_set.rb:223:in call'
actionpack (4.2.6) lib/action_dispatch/routing/route_set.rb:345:in
block (2 levels) in define_url_helper' actionpack (4.2.6)
lib/action_dispatch/routing/routes_proxy.rb:32:in user_password_path'
devise (4.2.0) lib/devise/controllers/url_helpers.rb:51:inblock (4
levels) in generate_helpers!' app/views/sessions/new.html.erb:45:in
_app_views_sessions_new_html_erb__3241459270597214406_43798180'
actionview (4.2.6) lib/action_view/template.rb:145:inblock in
render' activesupport (4.2.6)
lib/active_support/notifications.rb:166:in instrument' actionview
(4.2.6) lib/action_view/template.rb:333:ininstrument' actionview
(4.2.6) lib/action_view/template.rb:143:in render' actionview
(4.2.6) lib/action_view/renderer/template_renderer.rb:54:inblock (2
levels) in render_template' actionview (4.2.6)
lib/action_view/renderer/abstract_renderer.rb:39:in block in
instrument' activesupport (4.2.6)
lib/active_support/notifications.rb:164:inblock in instrument'
activesupport (4.2.6)
lib/active_support/notifications/instrumenter.rb:20:in instrument'
activesupport (4.2.6) lib/active_support/notifications.rb:164:in
instrument' actionview (4.2.6)
lib/action_view/renderer/abstract_renderer.rb:39:in instrument'
actionview (4.2.6) lib/action_view/renderer/template_renderer.rb:53:in
block in render_template' actionview (4.2.6)
lib/action_view/renderer/template_renderer.rb:61:in
render_with_layout' actionview (4.2.6)
lib/action_view/renderer/template_renderer.rb:52:inrender_template'
actionview (4.2.6) lib/action_view/renderer/template_renderer.rb:14:in
render' actionview (4.2.6)
lib/action_view/renderer/renderer.rb:46:inrender_template'
actionview (4.2.6) lib/action_view/renderer/renderer.rb:27:in render'
actionview (4.2.6) lib/action_view/rendering.rb:100:in
_render_template' actionpack (4.2.6)
lib/action_controller/metal/streaming.rb:217:in _render_template'
actionview (4.2.6) lib/action_view/rendering.rb:83:inrender_to_body'
actionpack (4.2.6) lib/action_controller/metal/rendering.rb:32:in
render_to_body' actionpack (4.2.6)
lib/action_controller/metal/renderers.rb:37:inrender_to_body'
actionpack (4.2.6) lib/abstract_controller/rendering.rb:25:in render'
actionpack (4.2.6) lib/action_controller/metal/rendering.rb:16:in
render' actionpack (4.2.6)
lib/action_controller/metal/instrumentation.rb:44:in block (2 levels)
in render' activesupport (4.2.6)
lib/active_support/core_ext/benchmark.rb:12:inblock in ms'
/home/osiuser/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/benchmark.rb:308:in
realtime' activesupport (4.2.6)
lib/active_support/core_ext/benchmark.rb:12:inms' actionpack
(4.2.6) lib/action_controller/metal/instrumentation.rb:44:in block in
render' actionpack (4.2.6)
lib/action_controller/metal/instrumentation.rb:87:in
cleanup_view_runtime' activerecord (4.2.6)
lib/active_record/railties/controller_runtime.rb:25:in
cleanup_view_runtime' actionpack (4.2.6)
lib/action_controller/metal/instrumentation.rb:43:inrender'
remotipart (1.2.1) lib/remotipart/render_overrides.rb:14:in
render_with_remotipart' responders (2.2.0)
lib/action_controller/responder.rb:238:indefault_render'
responders (2.2.0) lib/action_controller/responder.rb:170:in to_html'
responders (2.2.0) lib/action_controller/responder.rb:163:inrespond'
responders (2.2.0) lib/action_controller/responder.rb:156:in call'
responders (2.2.0) lib/action_controller/respond_with.rb:205:in
respond_with' devise (4.2.0)
app/controllers/devise/sessions_controller.rb:12:in `new'
These are the lines I am facing error:
sessions/new (from line 45):
<%= semantic_form_for(resource, :as => resource_name, :url => password_path(resource_name), :remote => true, :format => :json, :html => { :id => 'password_reset' }) do |f| %>
<%= f.inputs do %>
<%= f.input :email, :label => 'Your email address', :input_html => { :placeholder => "Enter your email..."}%>
<% end %>
<%= f.buttons do %>
<%= f.commit_button :label => 'Send me that link', :button_html => {:class => 'submit button'}%>
<% end %>
<% end %>
devise/session_controller:
def new
self.resource = resource_class.new(sign_in_params)
clean_up_passwords(resource)
yield resource if block_given?
respond_with(resource, serialize_options(resource)) #this is the line it's showing error.
end
In my sessions controller, there is no new method, only create and redirect methods and I am not having passwords controller.
This is my routes:
devise_for :users, :controllers => {:sessions => 'sessions'}, :path => '', :path_names => { :sign_in => "login", :sign_out => "logout" }
It is working in older version,so I didn't changed the routes.
Please help

Rails 4 - Associations - adding team mates to teams

I'm having trouble with my Rails 4 app.
I'm trying to follow this tutorial https://coderwall.com/p/rqjjca/creating-a-scoped-invitation-system-for-rails with some modifications.
The tutorial skips over a few steps that are considered by the writer to be too easy to bother with - I think that's where I'm getting stuck.
I have models for profile, project, team and user.
The associations are:
Profile.rb
has_many :teams, foreign_key: "team_mate_id"
has_many :team_projects, through: :teams, source: :project
has_many :invitations, :class_name => "Invite", :foreign_key => 'recipient_id'
has_many :sent_invites, :class_name => "Invite", :foreign_key => 'sender_id'
Project.rb
belongs_to :profile
has_one :team
has_many :team_mates, through: :team
has_many :invites
Team.rb
belongs_to :project
belongs_to :team_mate, class_name: "Profile"
Invite.rb
belongs_to :project
belongs_to :sender, :class_name => 'Profile'
belongs_to :recipient, :class_name => 'Profile'
In my routes, I have:
resources :invites
resources :teams
resources :profiles, only: [:show, :edit, :update, :destroy]
resources :projects do
member do
put "invite_team_mates" => "projects/invite_team_mates", as: :invitation
end
In my projects views folder, I have a partial with the invite form:
<%= form_for #invite , :url => invites_path do |f| %>
<%= f.hidden_field :project_id, :value => #invite.project_id %>
<%= f.label :email %>
<%= f.email_field :email %>
<%= f.submit 'Send' %>
<% end %>
I have also tried this as a general file called invite_team_mates.html.erb inside the project views folder and made a matching action for it in the projects controller, which has the action below: (with the route shown above for that specific action).
def invite_team_mate
project = Project.find(params[:id])
authorize #project
end
I'm also not sure if I have to change the opening line of form_for #invite should be something to do with #project.invite. Im not sure.
I also have an invites controller with:
class InvitesController < ApplicationController
def new
#invite = Invite.new
end
def create
#invite = Invite.new(invite_params)
#invite.sender_id = current_user.profile.id
if #invite.save
#if the user already exists
if #invite.recipient != nil
#send existing user email invitation to join project team
InviteMailer.existing_user_invite(#invite).deliver
#Add the user to the user group - inivte rsvp pending
#invite.recipient.project.push(#invite.project)
else
#send new user email invitation to join as a general user as well as join this project team
InviteMailer.new_user_invite(#invite, new_user_registration_path(:invite_token => #invite.token)).deliver
end
else
# oh no, creating an new invitation failed
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_invite
#invite = Invite.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def invite_params
params[:invite].permit(:email)
end
end
Im really stuck for how to hang all of this together.
My objective is to allow a user who creates a project to invite others to join the project team. I'm not getting far with this. When I try, to save all this and open the project, I get an error that says:
First argument in form cannot contain nil or be empty
The error highlights this line of the invites form partial:
<%= form_for #invite , :url => invites_path do |f| %>
When I try to change this line to use simple form syntax, as follows:
<%= simple_form_for(#invite, :url => invites_path) do |f| %>
I get an error that says:
undefined method `model_name' for nil:NilClass
I think that might have something to do with the form being for #invite when it is saved in the projects views folder.
Can anyone see what's gone wrong?
update - terminal lines
NoMethodError - undefined method `model_name' for nil:NilClass:
actionpack (4.2.4) lib/action_controller/model_naming.rb:9:in `model_name_from_record_or_class'
actionview (4.2.4) lib/action_view/record_identifier.rb:47:in `dom_class'
simple_form (3.2.0) lib/simple_form/action_view_extensions/form_helper.rb:62:in `simple_form_css_class'
simple_form (3.2.0) lib/simple_form/action_view_extensions/form_helper.rb:22:in `simple_form_for'
app/views/projects/_invite_team_mate.html.erb:6:in `_app_views_projects__invite_team_mate_html_erb___1258064784578419157_70357207009700'
actionview (4.2.4) lib/action_view/template.rb:145:in `block in render'
activesupport (4.2.4) lib/active_support/notifications.rb:166:in `instrument'
actionview (4.2.4) lib/action_view/template.rb:333:in `instrument'
actionview (4.2.4) lib/action_view/template.rb:143:in `render'
actionview (4.2.4) lib/action_view/renderer/partial_renderer.rb:339:in `render_partial'
actionview (4.2.4) lib/action_view/renderer/partial_renderer.rb:310:in `block in render'
actionview (4.2.4) lib/action_view/renderer/abstract_renderer.rb:39:in `block in instrument'
activesupport (4.2.4) lib/active_support/notifications.rb:164:in `block in instrument'
activesupport (4.2.4) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
activesupport (4.2.4) lib/active_support/notifications.rb:164:in `instrument'
actionview (4.2.4) lib/action_view/renderer/abstract_renderer.rb:39:in `instrument'
actionview (4.2.4) lib/action_view/renderer/partial_renderer.rb:309:in `render'
actionview (4.2.4) lib/action_view/renderer/renderer.rb:47:in `render_partial'
actionview (4.2.4) lib/action_view/renderer/renderer.rb:21:in `render'
actionview (4.2.4) lib/action_view/helpers/rendering_helper.rb:32:in `render'
haml (4.0.7) lib/haml/helpers/action_view_mods.rb:12:in `render_with_haml'
app/views/projects/show.html.erb:976:in `_app_views_projects_show_html_erb__3676206074319755518_70357179499400'
actionview (4.2.4) lib/action_view/template.rb:145:in `block in render'
activesupport (4.2.4) lib/active_support/notifications.rb:166:in `instrument'
actionview (4.2.4) lib/action_view/template.rb:333:in `instrument'
actionview (4.2.4) lib/action_view/template.rb:143:in `render'
actionview (4.2.4) lib/action_view/renderer/template_renderer.rb:54:in `block (2 levels) in render_template'
actionview (4.2.4) lib/action_view/renderer/abstract_renderer.rb:39:in `block in instrument'
activesupport (4.2.4) lib/active_support/notifications.rb:164:in `block in instrument'
activesupport (4.2.4) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
activesupport (4.2.4) lib/active_support/notifications.rb:164:in `instrument'
actionview (4.2.4) lib/action_view/renderer/abstract_renderer.rb:39:in `instrument'
actionview (4.2.4) lib/action_view/renderer/template_renderer.rb:53:in `block in render_template'
actionview (4.2.4) lib/action_view/renderer/template_renderer.rb:61:in `render_with_layout'
actionview (4.2.4) lib/action_view/renderer/template_renderer.rb:52:in `render_template'
actionview (4.2.4) lib/action_view/renderer/template_renderer.rb:14:in `render'
actionview (4.2.4) lib/action_view/renderer/renderer.rb:42:in `render_template'
actionview (4.2.4) lib/action_view/renderer/renderer.rb:23:in `render'
actionview (4.2.4) lib/action_view/rendering.rb:100:in `_render_template'
actionpack (4.2.4) lib/action_controller/metal/streaming.rb:217:in `_render_template'
actionview (4.2.4) lib/action_view/rendering.rb:83:in `render_to_body'
actionpack (4.2.4) lib/action_controller/metal/rendering.rb:32:in `render_to_body'
actionpack (4.2.4) lib/action_controller/metal/renderers.rb:37:in `render_to_body'
These lines go on and on - im not sure if this is what you mean by 'backtrace'

Redis -- undefined method `SMEMBERS' for nil:NilClass

I'm building a Rails shopping cart app using Redis. Everything works fine until I try to view my cart, at which point I get this error.
NoMethodError in CartsController#show
undefined method `SMEMBERS' for nil:NilClass
Extracted source (around line #6):
5 def show
6 cart_ids = $redis.SMEMBERS current_user_cart
7 #order_items = current_order.order_items
8 end
The beginning of the full trace:
app/controllers/carts_controller.rb:6:in `show'
actionpack (4.2.0) lib/action_controller/metal/implicit_render.rb:4:in `send_action'
actionpack (4.2.0) lib/abstract_controller/base.rb:198:in `process_action'
actionpack (4.2.0) lib/action_controller/metal/rendering.rb:10:in `process_action'
actionpack (4.2.0) lib/abstract_controller/callbacks.rb:20:in `block in process_action'
activesupport (4.2.0) lib/active_support/callbacks.rb:117:in `call'
activesupport (4.2.0) lib/active_support/callbacks.rb:117:in `call'
activesupport (4.2.0) lib/active_support/callbacks.rb:169:in `block in halting'
activesupport (4.2.0) lib/active_support/callbacks.rb:234:in `call'
...and thence through a bunch more behind-the-scenes stuff I haven't touched, mostly activesupport, activerecord, and railties.
Redis-server is installed and responsive; I have tested it with redis-cli.
Config/initializers/redis.rb:
uri = URI.parse(ENV["REDISTOGO_URL"])
REDIS = Redis.new(:url => uri)
App/controllers/carts_controller.rb:
class CartsController < ApplicationController
before_action :authenticate_user!
def show
cart_ids = $redis.SMEMBERS current_user_cart
#order_items = current_order.order_items
end
def add
$redis.SADD current_user_cart, params[:product_id]
render json: current_user.cart_count, status: 200
end
def remove
$redis.SREM current_user_cart, params[:product_id]
render json: current_user.cart_count, status: 200
end
private
def current_user_cart
"cart#{current_user.id}"
end
end
The worst part is that I had this problem last week, fixed it, and neglected to write down what the fix was! Anybody have any leads?
You are using uninitialized global variable $redis (look at your initializers/redis.rb where you declared constant REDIS but not $redis)
Ruby is case-sensitive language, the SMEMBERS and smembers are two different methods. So, I think you should use smembers method.
Turned out I had two versions of redis installed. I don't know if that was causing the problem, but when I uninstalled both and reinstalled the gem, the problem disappeared!

Render partial with locals

I'm using render with partials hundred times on my app but I've a problem with one and I don't understand why.
I'm calling partial recursively.
#index.html.slim
= render partial: 'medias/special_content', locals: {shops: #shops, shop: #shop}
#medias/_special_content.html.slim
= render partial: 'medias/more_specific', locals: {shops: shops, shop: shop}
#medias/_more_specific.html.slim
- if shops.nil?
#Some code
Here is my error:
undefined local variable or method `shops' for #<#
<Class:0x0000000775c360>:0x007f027cff5c28>
app/views/medias/_more_specific.html.slim:130:in
`_app_views_medias__more_specific_html_slim___1518734296928926472_69824330512820'
actionpack (3.2.17) lib/action_view/template.rb:145:in `block in render'
activesupport (3.2.17) lib/active_support/notifications.rb:125:in `instrument'
actionpack (3.2.17) lib/action_view/template.rb:143:in `render'
actionpack (3.2.17) lib/action_view/renderer/partial_renderer.rb:265:in `render_partial'
actionpack (3.2.17) lib/action_view/renderer/partial_renderer.rb:238:in `block in render'
actionpack (3.2.17) lib/action_view/renderer/abstract_renderer.rb:38:in `block in instrument'
activesupport (3.2.17) lib/active_support/notifications.rb:123:in `block in instrument'
activesupport (3.2.17) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
activesupport (3.2.17) lib/active_support/notifications.rb:123:in `instrument'
actionpack (3.2.17) lib/action_view/renderer/abstract_renderer.rb:38:in `instrument'
actionpack (3.2.17) lib/action_view/renderer/partial_renderer.rb:237:in `render'
actionpack (3.2.17) lib/action_view/renderer/renderer.rb:41:in `render_partial'
actionpack (3.2.17) lib/action_view/renderer/renderer.rb:15:in `render'
actionpack (3.2.17) lib/action_view/helpers/rendering_helper.rb:24:in `render'
app/views/medias/_special_content.html.slim:20:in
...
If it's the same partial where the error is originating from, then it looks like you're rendering the more_specific partial from somewhere else (i.e. not from the special_content file) and not passing the required variables through locals. Because otherwise, I don't think this error is possible.
You could also try the simple render syntax, like so:
render path_to_parent_partial, shops: #shops, shop: #shop # in index
render path_to_child_partial, shops: shops, shop: shop # in parent
But first, search for 'more_specific' in your project and see where you aren't passing the shops variable. You can also check the Rails Server logs output to see which view files are being rendered.
You can direct call #shops in #medias/_more_specific.html.slim because it is instance variable so it would also available here.
if #shops.blank?

Resources