2016-05-15 19 views
0

簡単なフォームを作成して、料理レックに投稿されたレシピについて新しいレビューを作成します。私はレシピのショーのページのレビューフォームをレンダリングするが、それは私に同じエラー与え続け:Railsシンプルフォーム未定義メソッド `model_name 'for nil:NilClass

nilのための未定義のメソッド `MODEL_NAME」:NilClassを私は部分的な新しいレビューフォームではレンダリングされません

app/views/recipes/show.html.erb、代わりにapp/views/reviews/new.html.erbというファイルを作成してください。私は、レシピのページでレンダリングしようとすると、フォームが動作しない理由を理解していません。ここで

は私のコードです:

シンプルなフォルムのため:

<%= simple_form_for(@review, url: recipe_reviews_path(@recipe)) do |f| %> 
    <%= f.error_notification %> 
    <%= f.input :content %> 
    <%= f.input :rating %> 
    <%= f.button :submit, class: "btn btn-success" %> 
<% end %> 

レビューコントローラ:

class ReviewsController < ApplicationController 
    def new 
    @recipe = recipe.find(params[:recipe_id]) 
    @review = Review.new(review_params) 
    end 

    def create 
    @recipe = recipe.find(params[:recipe_id]) 
    @review = Review.new(review_params) 
    @review.recipe = @recipe 
    if @review.save 
     redirect_to recipe_path(@recipe) 
    else 
     render 'recipe/show' 
    end 
    end 

    private 

    def review_params 
    params.require(:review).permit(:content, :rating) 
    end 
end 

レシピコントローラ:

class RecipesController < ApplicationController 
    skip_before_action :authenticate_user! 
    def index 
    @recipes = Recipe.all 
    end 

    def show 
    @recipe = Recipe.find(params[:id]) 
    @user = User.find(@recipe.user_id) 
    @full_name = @recipe.user.first_name + " " + @recipe.user.last_name 
    end 
end 

レシピショーのページ:

<div class="review"> 
    <%= render 'review/new' %> 

    <% @recipe.reviews.each do |review| %> 
     <%= review.content %> 
     <%= review.rating %> 
    <% end %> 
</div> 

ルート:

resources :recipes, only: [:index, :show] do 
    resources :reviews, only: [:create] 
    end 

モデル:

class Recipe < ActiveRecord::Base 
    belongs_to :user 
    has_many :ingredients, dependent: :destroy 
    has_many :reviews, dependent: :destroy 

    validates :name, :summary, :course, :kitchen, :photo, :description, presence: true 
    validates :summary, length: { maximum: 30 } 
    mount_uploader :photo, PhotoUploader 

    accepts_nested_attributes_for :ingredients, reject_if: :all_blank, allow_destroy: true 
end 

モデルのレビュー:

class Review < ActiveRecord::Base 
    belongs_to :recipe 

    validates :content, length: { minimum: 20 } 
    validates :rating, presence: true 
    validates_numericality_of :rating, :greater_than_or_equal_to => 0, :less_than_or_equal_to => 5 
    validates :content, presence: true 
end 

誰もが問題を見ることができますか?前もって感謝します!

+0

モデルとレシピコントローラを投稿してもよろしいですか? –

+1

私はそれらを投稿します – Seifer

+0

**あなたの問題は** @ recipe = Recipe.find(params [:id])**が対応するレシピを見つけていないし、nilを返していないことにあります。次に、ビューで、あなたが**@recipe.reviews.each**と言うとき、それはあなたがnilクラスからのモデル名(レビュー)を参照していると不平を言っています。 –

答えて

1

ちょうどRecipesControllerコントローラのshowアクションにレビューモーダルの新しいインスタンスを作成する必要があります - :

すべてをだ

@review = Review.new

、私は動作します。 :)

+0

ありがとうございました! – Seifer

+0

あなたの大歓迎@Seifer –

0

RecipesControllerに新しい方法がありますか?シンプルフォームビューで@recipeを使っているからです。あなたは

def new 
@recipe = recipe.find(params[:recipe_id]) 
@review = Review.new(review_params) 
end 
+1

インデントのために編集しました。コードを理解する上で、良いインデントが大いに役立ちます。 –

+0

新しいメソッドをRecipesControllerに追加しましたが、まだエラーが発生します。 : – Seifer

+0

私はそれについて不満があると思う:** <%= simple_form_for(@review、url:recipe_reviews_path(@recipe))do | f |%> ** – Seifer

関連する問題