【问题标题】:Rails simple form undefined method `model_name' for nil:NilClass用于 nil:NilClass 的 Rails 简单形式未定义方法“model_name”
【发布时间】: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


【解决方案1】:

只需在 RecipesController 的显示操作中创建 Review Modal 的新实例 -:

@review = Review.new

就是这样,我会工作的。 :)

【讨论】:

    【解决方案2】:

    RecipesController 中有新方法吗?因为您在 simpleform 视图中使用 @recipe。你需要

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

    【讨论】:

    • 我编辑是为了缩进。良好的缩进对理解代码有很大帮助。
    • 我现在在 RecipesController 中添加了新方法,但我仍然收到错误消息。 :(
    • 我认为它在抱怨:
    • 没问题,@PadmanabanGokula。希望你不要生气。这只是保持代码质量的问题,我相信你明白这有多重要。
    • @EddeAlmeida 我同意 :)
    猜你喜欢
    • 1970-01-01
    • 2018-10-07
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多