所以我正在尝试创建一个表单供用户留下关于电影的评论,但Rails不断向我抛出一个未定义的方法错误。我的应用程序允许用户查看电影。所以我希望表单允许用户在该电影的上下文中创建评论。我的代码如下,任何帮助将不胜感激。我唯一的困惑是,我不确定是否应该嵌套资源,或者我只是使用为form_for
指定错误的值
我的路线文件如下所示:
resources :users
resources :movies
resources :reviews
resources :sessions, only: [:new, :create, :destroy]
我有一个评论控制器,如下所示:
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
我的表格看起来像这样:
<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 %>
我有三种模式:
用户:
class User < ActiveRecord::Base
has_secure_password
has_many :reviews, dependent: :destroy
has_many :movies, through: :reviews
end
电影:
class Movie < ActiveRecord::Base
has_many :reviews
has_many :users, through: :reviews
end
修改:
class Review < ActiveRecord::Base
attr_accessible :content, :movie_id
belongs_to :user
belongs_to :anime
end
这是错误:
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..." %>
答案 0 :(得分:2)
你的@review实例变量实际上是一部电影。 @ review.movie将是未定义的
修改强>
好的,您编辑了问题以修复@review变量。
现在发生的事情是你的Review控制器设置@review实例变量,然后重定向到Movies#show。重定向请求会有效地抛出您在Review控制器中设置的所有实例变量。
所以从电影#show的角度来看,@ lookview并不存在。
分享您的电影控制器节目动作的代码,以便我们可以看到正在发生的事情,或者只是尝试重新定义电影中的@review#show
@movie = Movie.find params[:id]
@review = current_user.reviews.build(movie: @movie)
答案 1 :(得分:0)
您的控制器的新操作中是否有@review = Review.new
?
答案 2 :(得分:0)
不确定它与表单问题有关,但在create
方法中,您创建的是Movie
而不是Review
。
也不确定为什么要删除密钥movie_id
,然后在调用new
后将其添加回对象