为什么在Rails中创建表单时,为NilClass:Class继续获取未定义的方法`model_name'?

时间:2012-08-01 14:32:17

标签: ruby-on-rails ruby-on-rails-3

所以我正在尝试创建一个表单供用户留下关于电影的评论,但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..." %>

3 个答案:

答案 0 :(得分:2)

你的@review实例变量实际上是一部电影。 @ review.movi​​e将是未定义的

修改

好的,您编辑了问题以修复@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后将其添加回对象