nil:NilClass 的未定义方法"评论"



我正在尝试为公司页面创建一个评论模型。为此,我有:

型号

user.rb
has_many :reviews
class Review < ActiveRecord::Base
    belongs_to :user
    belongs_to :company 
end
class Company < ActiveRecord::Base
    has_many :reviews
end

我的评论管理员是:

  def create
    @company = Company.find_by_slug(params[:id])
    @review = @company.reviews.create(params[:review])
    @review.save
    redirect_to company_path(@company)
  end

我在公司展示页面上有这样的代码:

  <% @company.reviews.each do |review| %>
    <p>
      <strong>Title:</strong>
      <%= review.title %>
    </p>
    <p>
      <strong>Avantage:</strong>
      <%= review.avantage %>
    </p>
    <p>
      <strong>Inconvenient:</strong>
      <%= review.inconvenient %>
    </p>
  <% end %>
</br>
<%= form_for([@company, @company.reviews.build]) do |f| %>
  <div class="field">
    <%= f.label :title %><br>
    <%= f.text_field :title %>
  </div>
  <div class="field">
    <%= f.label :avantage %><br>
    <%= f.text_area :avantage %>
  </div>
  <div class="field">
    <%= f.label :inconvenient %><br>
    <%= f.text_area :inconvenient %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

然而,当我转到一个特定的公司页面并尝试为该公司创建评论时,我会收到以下错误消息undefined method reviews for nil:NilClass

使用此代码@company = Company.friendly.find(params[:company_id])

而不是@company = Company.find_by_slug(params[:id])

您可能会发现一些有用的东西:

  1. 如果您正在使用Rails4,您可能会遇到另一个问题。在create方法的第三行中,直接在.create调用中使用不安全的params。查看"strong params"上的Rails指南页面。

  2. 如果您实现了上面提到的强参数,那么您可能应该故意从允许的参数列表中省略company_id字段。

  3. 假设您的用户可以为系统中的任何公司撰写评论,那么在表单中嵌入company_id作为隐藏字段可能会更简单。这也可以简化控制器方法。例如:

    # _form.html.erb
    <%= form_for(@review) do |f| %>
      <%= f.hidden_field :company_id, value: @company.id %>
     ...bla bla bla
    <% end %>
    

    然后,在您的reviews_controller中。。。

    # reviews_controller.rb
    def create
      @review = Review.new(approved_params)
      if @review.save
        flash[:success] = 'Review created!'
      else
        flash[:error] = "Review wasn't saved"
      end
      @company = @review.company
      redirect_to @company
    end
    def approved_params
       params.require(:review).permit(:title, :avantage, :inconvenient, :company_id)
    end
    

    在你的公司_控制程序中,你应该将其添加到你的显示方法中

    # companies_controller.rb
    def show
      @company = Company.find(params[:id]
      # add this line below...
      @review = Review.new
    end
    

我希望这能有所帮助。

相关内容

最新更新