【发布时间】:2016-05-15 10:48:57
【问题描述】:
我想创建一个简单的表单来对已发布在食谱中的食谱进行新的评论。我在食谱展示页面上呈现了评论表单,但它一直给我同样的错误:
nil:NilClass 的未定义方法 `model_name'
当我不在 app/views/recipes/show.html.erb 处呈现部分新评论表单时,而是创建文件 app/views/reviews/new. html.erb,只有这样表单才有效。我不明白为什么当我尝试在 show recipe 页面呈现表单时表单不起作用。
这是我的代码:
简单形式:
<%= 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
任何人都可以看到问题吗?提前谢谢!
【问题讨论】:
-
您介意发布模型和RecipesController吗?
-
我相信你的问题在于 @recipe = Recipe.find(params[:id]) 没有找到相应的食谱然后返回零。然后,在视图中,当您说 @recipe.reviews.each 时,它会抱怨您从 nil 类引用模型名称(评论)。
-
此外,在您的显示视图中您说 render 'review/new' 但我在您的 ReviewController 中看不到新方法。你有 app/views/review/_new.html.erb 文件吗?
-
我确实有一个 app/views/review/_new.html.erb 文件。我首先在 ReviewController 中有一个新方法,但这并没有什么区别。
-
当我注释掉 app/views/recipes/show.html.erb中的 >,然后一切正常。当然,创建评论部分是我无法开始工作的事情。我之所以在 app/views/recipes/show.html.erb 呈现评论新表单是因为我想在最后使用 Ajax。
标签: ruby-on-rails ruby simple-form-for