0

所以我试图创建一个表单让用户对电影发表评论,但 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..." %>
4

3 回答 3

2

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

编辑

好的,您编辑了您的问题以修复您的 @review 变量。

所以现在发生的事情是您的 Review 控制器设置了 @review 实例变量,然后重定向到 Movies#show。重定向请求有效地抛出了您在 Review 控制器中设置的所有实例变量。

所以从 Movies#show 的角度来看,@review 是不存在的。

共享您的电影控制器显示操作的代码,以便我们可以看到发生了什么,或者只是尝试在电影#show 中重新定义 @review

@movie = Movie.find params[:id]
@review = current_user.reviews.build(movie: @movie)
于 2012-08-01T14:38:53.020 回答
0

你有@review = Review.new你的控制器的新动作吗?

于 2012-08-01T14:36:09.870 回答
0

不确定它与表单问题有关,但在create方法中,您创建的是 aMovie而不是Review.

也不确定为什么要删除密钥movie_id,然后在调用后将其添加回对象new

于 2012-08-01T14:38:59.297 回答