So I’m trying to create a form for users to leave a review about a movie but Rails keeps throwing an undefined method error at me. My app allows users to review movies. So I want the form to allow the user to create a review in the context of that movie. My code is below, any help would be much appreciated. My only confusion is, I’m not sure whether I should nest the resources or I’m just using specifying the wrong value for form_for
My routes file looks like this:
resources :users
resources :movies
resources :reviews
resources :sessions, only: [:new, :create, :destroy]
I have a Reviews controller which looks like this:
class ReviewsController < ApplicationController
def create
movie_id = params[:review].delete(:movie_id)
@review = Review.new(params[:review])
@review.movie_id = movie_id
@review.save
redirect_to movie_path(@review.movie)
end
end
And my form looks like this:
<h2>Leave a Review</h2>
<%= form_for(@review) do |f| %>
<%= f.hidden_field :movie_id %>
<div class="field">
<%= f.text_area :content, placeholder: "Write a new review..." %>
</div>
<%= f.submit "Submit", class: "btn btn-large btn-primary" %>
<% end %>
I have three models:
User:
class User < ActiveRecord::Base
has_secure_password
has_many :reviews, dependent: :destroy
has_many :movies, through: :reviews
end
Movie:
class Movie < ActiveRecord::Base
has_many :reviews
has_many :users, through: :reviews
end
Review:
class Review < ActiveRecord::Base
attr_accessible :content, :movie_id
belongs_to :user
belongs_to :anime
end
Here is the error:
NoMethodError in Movies#show
Showing /Users/david/Sites/Rails/Chirp/app/views/movies/show.html.erb where line #32 raised:
undefined method `model_name' for NilClass:Class
Extracted source (around line #32):
29:
30: <h2>Leave a Review</h2>
31:
32: <%= form_for(@review) do |f| %>
33: <%= f.hidden_field :movie_id %>
34: <div class="field">
35: <%= f.text_area :content, placeholder: "Write a new review..." %>
Your @review instance variable is actually a Movie. @review.movie will be undefined
EDIT
Ok, you edited your question to fix your @review variable.
So what’s happening now is that your Review controller sets up the @review instance variable, and then does a redirects to Movies#show. The redirect request effectively throws out all the instance variables you setup in your Review controller.
So from the point of view of Movies#show, @review doesn’t exist.
Either share your code for your Movies controller show action so we can see what’s going on, or just try redefining @review in Movies#show