0

そのため、ユーザーが映画についてレビューを残すためのフォームを作成しようとしていますが、Rails は未定義のメソッド エラーをスローし続けます。私のアプリでは、ユーザーが映画をレビューできます。そのため、ユーザーがその映画のコンテキストでレビューを作成できるフォームが必要です。私のコードは以下のとおりです。どんな助けでも大歓迎です。私の唯一の混乱は、リソースをネストする必要があるのか​​ 、それとも間違った値を指定して使用しているのかわからないことですform_for

私のルートファイルは次のようになります。

  resources :users
  resources :movies
  resources :reviews
  resources :sessions, only: [:new, :create, :destroy]

次のような Reviews コントローラーがあります。

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 %>

私は3つのモデルを持っています:

ユーザー:

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 インスタンス変数は実際には Movie です。@review.movi​​e は未定義になります

編集

OK、質問を編集して @review 変数を修正しました。

ここで、Review コントローラーが @review インスタンス変数を設定し、Movies#show にリダイレクトします。リダイレクト リクエストは、Review コントローラーで設定したすべてのインスタンス変数を効果的に破棄します。

したがって、Movies#show の観点からすると、@review は存在しません。

何が起こっているかを確認できるように、ムービー コントローラーの show アクションのコードを共有するか、Movies#show で @review を再定義してみてください。

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

フォームの問題に関連しているかどうかはわかりませんが、createメソッドでは、のMovie代わりにを作成していますReview

movie_idまた、キーを削除し、への呼び出し後にオブジェクトに追加し直す理由もわかりません。new

于 2012-08-01T14:38:59.297 に答える
0

@review = Review.newコントローラーの新しいアクションはありますか?

于 2012-08-01T14:36:09.870 に答える