未定义的方法`评论'为零:NilClass

时间:2014-10-14 00:42:24

标签: ruby-on-rails ruby-on-rails-4 associations

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

模型

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为nil:NilClass

2 个答案:

答案 0 :(得分:1)

而不是@company = Company.find_by_slug(params[:id])使用此代码@company = Company.friendly.find(params[:company_id])

答案 1 :(得分:1)

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

  1. 如果您使用的是Rails 4,则可能会遇到其他问题。在create方法的第三行中,您在.create调用中直接使用不安全的params。 Check out the Rails Guide page on&#34;强大的参数&#34;。

  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中,你应该将它添加到你的show方法

    # companies_controller.rb
    def show
      @company = Company.find(params[:id]
      # add this line below...
      @review = Review.new
    end
    
  4. 我希望这会有所帮助。