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'
Related
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
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
I'm building an app that features workouts models, each workout has_many exercises, and each exercise has_many reports.
My routes are as follows:
workouts GET /workouts(.:format) workouts#index
POST /workouts(.:format) workouts#create
new_workout GET /workouts/new(.:format) workouts#new
edit_workout GET /workouts/:id/edit(.:format) workouts#edit
workout GET /workouts/:id(.:format) workouts#show
PATCH /workouts/:id(.:format) workouts#update
PUT /workouts/:id(.:format) workouts#update
DELETE /workouts/:id(.:format) workouts#destroy
exercises GET /exercises(.:format) exercises#index
POST /exercises(.:format) exercises#create
new_exercise GET /exercises/new(.:format) exercises#new
edit_exercise GET /exercises/:id/edit(.:format) exercises#edit
exercise GET /exercises/:id(.:format) exercises#show
PATCH /exercises/:id(.:format) exercises#update
PUT /exercises/:id(.:format) exercises#update
DELETE /exercises/:id(.:format) exercises#destroy
reports POST /reports(.:format) reports#create
report DELETE /reports/:id(.:format) reports#destroy
I toyed with nesting the routes, but it caused more problems than it solved, so they remain like this:
resources :workouts
resources :exercises
resources :reports, only: [:create, :destroy]
On my workouts#show page I have a link to add exercises to that workout:
<%= link_to 'Add/Edit Exercises', exercises_path(#workout) %>
When I click the link, I get the following error:
undefined method `id' for nil:NilClass
When I click the link, it SHOULD go to my exercises#index page:
<h1>Current Exercises:</h1>
<% #exercises.each do |exercise| %>
<p><%= exercise.name %> (<%= link_to "Delete #{exercise.name}", exercise_path(exercise), method: :delete, data: { confirm: 'Are you sure?' } %>)</p>
<% end %>
<h1>Add New Exercises:</h1>
<%= render 'exercises/form' %>
It is on the exercises/_form.html.erb that the error is being called, on the indicated line:
<div class="row">
<div class="col-xs-10 col-xs-push-1">
<%= form_for #exercise,
:url => { :controller => "exercises",
:action => :create,
:workout_id => #workout.id } do |f| %> <!-- error called on this line -->
<div class="form-group">
<%= f.label :name, class: 'sr-only' %>
<%= f.text_field :name, class: 'form-control', placeholder: "Enter exercise name" %>
</div>
<div class="form-group col-xs-4">
<p><%= f.label :needs_seconds, class: 'sr-only' %>
<%= f.check_box :needs_seconds, class: 'check_box' %> Report seconds?</p>
</div>
<div class="form-group col-xs-4">
<p><%= f.label :needs_reps, class: 'sr-only' %>
<%= f.check_box :needs_reps, class: 'check_box' %> Report reps?</p>
</div>
<div class="form-group col-xs-4">
<p><%= f.label :needs_weight, class: 'sr-only' %>
<%= f.check_box :needs_weight, class: 'check_box' %> Report weight?</p>
</div>
<div class="text-center"><%= f.submit "Create Exercise", class: 'btn btn-primary' %></div>
<% end %>
</div>
</div>
Any insight as to what is causing this error? Here's my workouts controller:
class WorkoutsController < ApplicationController
def index
#workouts = Workout.all
end
def show
#workout = Workout.friendly.find(params[:id])
#exercise = Exercise.new
#report = Report.new
end
def new
#workout = Workout.new
#workout.user_id = current_user
end
def create
#workout = Workout.new(workout_params)
#workout.user = current_user
if #workout.save
flash[:notice] = "Workout was saved successfully."
redirect_to #workout
else
flash.now[:alert] = "Error creating workout. Please try again."
render :new
end
end
def edit
#workout = Workout.friendly.find(params[:id])
#workout.user_id = current_user
end
def update
#workout = Workout.friendly.find(params[:id])
#workout.name = params[:workout][:name]
#workout.workout_type = params[:workout][:workout_type]
#workout.teaser = params[:workout][:teaser]
#workout.description = params[:workout][:description]
#workout.video = params[:workout][:video]
#workout.difficulty = params[:workout][:difficulty]
#workout.trainer = params[:workout][:trainer]
#workout.user_id = params[:workout][:user_id]
if #workout.save
flash[:notice] = "Workout was updated successfully."
redirect_to #workout
else
flash.now[:alert] = "Error saving workout. Please try again."
render :edit
end
end
def destroy
#workout = Workout.friendly.find(params[:id])
if #workout.destroy
flash[:notice] = "\"#{#workout.name}\" was deleted successfully."
redirect_to action: :index
else
flash.now[:alert] = "There was an error deleting the workout."
render :show
end
end
private
def workout_params
params.require(:workout).permit(:name, :workout_type, :teaser, :description, :video, :difficulty, :trainer, :user_id)
end
end
And here's the exercises controller:
class ExercisesController < ApplicationController
before_action :authenticate_user!
def index
#exercises = Exercise.all
end
def new
#exercise = Exercise.new
end
def create
#workout = Workout.friendly.find(params[:workout_id])
exercise = #workout.exercises.new(exercise_params)
exercise.user = current_user
if exercise.save
flash[:notice] = "Results saved successfully."
redirect_to [#workout]
else
flash[:alert] = "Results failed to save."
redirect_to [#workout]
end
end
def destroy
#workout = Workout.friendly.find(params[:workout_id])
exercise = #workout.exercises.find(params[:id])
if exercise.destroy
flash[:notice] = "Exercise was deleted successfully."
redirect_to [#workout]
else
flash[:alert] = "Exercise couldn't be deleted. Try again."
redirect_to [#workout]
end
end
private
def exercise_params
params.require(:exercise).permit(:name, :needs_seconds, :needs_weight, :needs_reps)
end
def authorize_user
exercise = Exercise.find(params[:id])
unless current_user == current_user.admin?
flash[:alert] = "You do not have permission to create or delete an exercise."
redirect_to [exercise.workout]
end
end
end
And here's the server log:
Started GET "/exercises.abs-0002" for ::1 at 2016-06-01 13:10:33 -0700
Processing by ExercisesController#index as
User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT 1 [["id", 1]]
Workout Load (0.1ms) SELECT "workouts".* FROM "workouts" WHERE "workouts"."id" IS NULL LIMIT 1
Exercise Load (0.1ms) SELECT "exercises".* FROM "exercises"
Rendered exercises/_form.html.erb (9.6ms)
Rendered exercises/index.html.erb within layouts/application (18.4ms)
Completed 500 Internal Server Error in 33ms (ActiveRecord: 0.3ms)
NoMethodError - undefined method `id' for nil:NilClass:
app/views/exercises/_form.html.erb:4:in `block in _app_views_exercises__form_html_erb___1550785662008061170_70245396037240'
actionview (4.2.5) lib/action_view/helpers/capture_helper.rb:38:in `block in capture'
actionview (4.2.5) lib/action_view/helpers/capture_helper.rb:202:in `with_output_buffer'
actionview (4.2.5) lib/action_view/helpers/capture_helper.rb:38:in `capture'
actionview (4.2.5) lib/action_view/helpers/form_helper.rb:444:in `form_for'
app/views/exercises/_form.html.erb:3:in `_app_views_exercises__form_html_erb___1550785662008061170_70245396037240'
actionview (4.2.5) lib/action_view/template.rb:145:in `block in render'
activesupport (4.2.5) lib/active_support/notifications.rb:166:in `instrument'
actionview (4.2.5) lib/action_view/template.rb:333:in `instrument'
actionview (4.2.5) lib/action_view/template.rb:143:in `render'
actionview (4.2.5) lib/action_view/renderer/partial_renderer.rb:339:in `render_partial'
actionview (4.2.5) lib/action_view/renderer/partial_renderer.rb:310:in `block in render'
actionview (4.2.5) lib/action_view/renderer/abstract_renderer.rb:39:in `block in instrument'
activesupport (4.2.5) lib/active_support/notifications.rb:164:in `block in instrument'
activesupport (4.2.5) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
activesupport (4.2.5) lib/active_support/notifications.rb:164:in `instrument'
actionview (4.2.5) lib/action_view/renderer/abstract_renderer.rb:39:in `instrument'
actionview (4.2.5) lib/action_view/renderer/partial_renderer.rb:309:in `render'
actionview (4.2.5) lib/action_view/renderer/renderer.rb:47:in `render_partial'
actionview (4.2.5) lib/action_view/helpers/rendering_helper.rb:35:in `render'
app/views/exercises/index.html.erb:7:in `_app_views_exercises_index_html_erb___2271140629366515446_70245347113980'
actionview (4.2.5) lib/action_view/template.rb:145:in `block in render'
activesupport (4.2.5) lib/active_support/notifications.rb:166:in `instrument'
actionview (4.2.5) lib/action_view/template.rb:333:in `instrument'
actionview (4.2.5) lib/action_view/template.rb:143:in `render'
actionview (4.2.5) lib/action_view/renderer/template_renderer.rb:54:in `block (2 levels) in render_template'
actionview (4.2.5) lib/action_view/renderer/abstract_renderer.rb:39:in `block in instrument'
activesupport (4.2.5) lib/active_support/notifications.rb:164:in `block in instrument'
activesupport (4.2.5) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
activesupport (4.2.5) lib/active_support/notifications.rb:164:in `instrument'
actionview (4.2.5) lib/action_view/renderer/abstract_renderer.rb:39:in `instrument'
actionview (4.2.5) lib/action_view/renderer/template_renderer.rb:53:in `block in render_template'
actionview (4.2.5) lib/action_view/renderer/template_renderer.rb:61:in `render_with_layout'
actionview (4.2.5) lib/action_view/renderer/template_renderer.rb:52:in `render_template'
actionview (4.2.5) lib/action_view/renderer/template_renderer.rb:14:in `render'
actionview (4.2.5) lib/action_view/renderer/renderer.rb:42:in `render_template'
actionview (4.2.5) lib/action_view/renderer/renderer.rb:23:in `render'
actionview (4.2.5) lib/action_view/rendering.rb:100:in `_render_template'
actionpack (4.2.5) lib/action_controller/metal/streaming.rb:217:in `_render_template'
actionview (4.2.5) lib/action_view/rendering.rb:83:in `render_to_body'
actionpack (4.2.5) lib/action_controller/metal/rendering.rb:32:in `render_to_body'
actionpack (4.2.5) lib/action_controller/metal/renderers.rb:37:in `render_to_body'
actionpack (4.2.5) lib/abstract_controller/rendering.rb:25:in `render'
actionpack (4.2.5) lib/action_controller/metal/rendering.rb:16:in `render'
actionpack (4.2.5) lib/action_controller/metal/instrumentation.rb:44:in `block (2 levels) in render'
activesupport (4.2.5) lib/active_support/core_ext/benchmark.rb:12:in `block in ms'
/Users/elizabethbayardelle/.rbenv/versions/2.2.4/lib/ruby/2.2.0/benchmark.rb:303:in `realtime'
activesupport (4.2.5) lib/active_support/core_ext/benchmark.rb:12:in `ms'
actionpack (4.2.5) lib/action_controller/metal/instrumentation.rb:44:in `block in render'
actionpack (4.2.5) lib/action_controller/metal/instrumentation.rb:87:in `cleanup_view_runtime'
activerecord (4.2.5) lib/active_record/railties/controller_runtime.rb:25:in `cleanup_view_runtime'
actionpack (4.2.5) lib/action_controller/metal/instrumentation.rb:43:in `render'
meta-tags (2.1.0) lib/meta_tags/controller_helper.rb:26:in `render_with_meta_tags'
remotipart (1.2.1) lib/remotipart/render_overrides.rb:14:in `render_with_remotipart'
actionpack (4.2.5) lib/action_controller/metal/implicit_render.rb:10:in `default_render'
actionpack (4.2.5) lib/action_controller/metal/implicit_render.rb:5:in `send_action'
actionpack (4.2.5) lib/abstract_controller/base.rb:198:in `process_action'
actionpack (4.2.5) lib/action_controller/metal/rendering.rb:10:in `process_action'
actionpack (4.2.5) lib/abstract_controller/callbacks.rb:20:in `block in process_action'
activesupport (4.2.5) lib/active_support/callbacks.rb:117:in `call'
activesupport (4.2.5) lib/active_support/callbacks.rb:555:in `block (2 levels) in compile'
activesupport (4.2.5) lib/active_support/callbacks.rb:505:in `call'
activesupport (4.2.5) lib/active_support/callbacks.rb:92:in `__run_callbacks__'
activesupport (4.2.5) lib/active_support/callbacks.rb:778:in `_run_process_action_callbacks'
activesupport (4.2.5) lib/active_support/callbacks.rb:81:in `run_callbacks'
actionpack (4.2.5) lib/abstract_controller/callbacks.rb:19:in `process_action'
actionpack (4.2.5) lib/action_controller/metal/rescue.rb:29:in `process_action'
actionpack (4.2.5) lib/action_controller/metal/instrumentation.rb:32:in `block in process_action'
activesupport (4.2.5) lib/active_support/notifications.rb:164:in `block in instrument'
activesupport (4.2.5) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
activesupport (4.2.5) lib/active_support/notifications.rb:164:in `instrument'
actionpack (4.2.5) lib/action_controller/metal/instrumentation.rb:30:in `process_action'
actionpack (4.2.5) lib/action_controller/metal/params_wrapper.rb:250:in `process_action'
activerecord (4.2.5) lib/active_record/railties/controller_runtime.rb:18:in `process_action'
actionpack (4.2.5) lib/abstract_controller/base.rb:137:in `process'
actionview (4.2.5) lib/action_view/rendering.rb:30:in `process'
actionpack (4.2.5) lib/action_controller/metal.rb:196:in `dispatch'
actionpack (4.2.5) lib/action_controller/metal/rack_delegation.rb:13:in `dispatch'
actionpack (4.2.5) lib/action_controller/metal.rb:237:in `block in action'
actionpack (4.2.5) lib/action_dispatch/routing/route_set.rb:76:in `dispatch'
actionpack (4.2.5) lib/action_dispatch/routing/route_set.rb:45:in `serve'
actionpack (4.2.5) lib/action_dispatch/journey/router.rb:43:in `block in serve'
actionpack (4.2.5) lib/action_dispatch/journey/router.rb:30:in `serve'
actionpack (4.2.5) lib/action_dispatch/routing/route_set.rb:817:in `call'
warden (1.2.6) lib/warden/manager.rb:35:in `block in call'
warden (1.2.6) lib/warden/manager.rb:34:in `call'
rack (1.6.4) lib/rack/etag.rb:24:in `call'
rack (1.6.4) lib/rack/conditionalget.rb:25:in `call'
rack (1.6.4) lib/rack/head.rb:13:in `call'
remotipart (1.2.1) lib/remotipart/middleware.rb:27:in `call'
actionpack (4.2.5) lib/action_dispatch/middleware/params_parser.rb:27:in `call'
actionpack (4.2.5) lib/action_dispatch/middleware/flash.rb:260:in `call'
rack (1.6.4) lib/rack/session/abstract/id.rb:225:in `context'
rack (1.6.4) lib/rack/session/abstract/id.rb:220:in `call'
actionpack (4.2.5) lib/action_dispatch/middleware/cookies.rb:560:in `call'
activerecord (4.2.5) lib/active_record/query_cache.rb:36:in `call'
activerecord (4.2.5) lib/active_record/connection_adapters/abstract/connection_pool.rb:653:in `call'
activerecord (4.2.5) lib/active_record/migration.rb:377:in `call'
actionpack (4.2.5) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
activesupport (4.2.5) lib/active_support/callbacks.rb:88:in `__run_callbacks__'
activesupport (4.2.5) lib/active_support/callbacks.rb:778:in `_run_call_callbacks'
activesupport (4.2.5) lib/active_support/callbacks.rb:81:in `run_callbacks'
actionpack (4.2.5) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
actionpack (4.2.5) lib/action_dispatch/middleware/reloader.rb:73:in `call'
actionpack (4.2.5) lib/action_dispatch/middleware/remote_ip.rb:78:in `call'
better_errors (2.1.1) lib/better_errors/middleware.rb:84:in `protected_app_call'
better_errors (2.1.1) lib/better_errors/middleware.rb:79:in `better_errors_call'
better_errors (2.1.1) lib/better_errors/middleware.rb:57:in `call'
actionpack (4.2.5) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'
actionpack (4.2.5) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
railties (4.2.5) lib/rails/rack/logger.rb:38:in `call_app'
railties (4.2.5) lib/rails/rack/logger.rb:20:in `block in call'
activesupport (4.2.5) lib/active_support/tagged_logging.rb:68:in `block in tagged'
activesupport (4.2.5) lib/active_support/tagged_logging.rb:26:in `tagged'
activesupport (4.2.5) lib/active_support/tagged_logging.rb:68:in `tagged'
railties (4.2.5) lib/rails/rack/logger.rb:20:in `call'
actionpack (4.2.5) lib/action_dispatch/middleware/request_id.rb:21:in `call'
rack (1.6.4) lib/rack/methodoverride.rb:22:in `call'
rack (1.6.4) lib/rack/runtime.rb:18:in `call'
activesupport (4.2.5) lib/active_support/cache/strategy/local_cache_middleware.rb:28:in `call'
rack (1.6.4) lib/rack/lock.rb:17:in `call'
actionpack (4.2.5) lib/action_dispatch/middleware/static.rb:116:in `call'
rack (1.6.4) lib/rack/sendfile.rb:113:in `call'
railties (4.2.5) lib/rails/engine.rb:518:in `call'
railties (4.2.5) lib/rails/application.rb:165:in `call'
rack (1.6.4) lib/rack/lock.rb:17:in `call'
rack (1.6.4) lib/rack/content_length.rb:15:in `call'
rack (1.6.4) lib/rack/handler/webrick.rb:88:in `service'
You link_to in workouts#show can be like below:
<%= link_to 'Add/Edit Exercises', exercises_path(workout_id: #workout.id) %>
exercises_controller.rb
def index
#workout = Workout.find_by_id(params[:workout_id])
#exercise = Exercise.new
#exercises = Exercise.all
end
You can pass the workout_id in hidden field of exercises/_form.html.erb as follows:
<%= form_for #exercise do |f| %>
<%= f.hidden_field :workout_id, #workout.id %>
<% end %>
And, include workout_id to your strong param as follows:
def exercise_params
params.require(:exercise).permit(:name, :needs_seconds, :needs_weight, :needs_reps, :workout_id)
end
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?
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.