【问题标题】:undefined method `reviews' for nil:NilClassnil:NilClass 的未定义方法“评论”
【发布时间】:2014-10-14 00:42:24
【问题描述】:

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

型号

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

【问题讨论】:

  • 看看你在叫什么reviews - 它是零。
  • 当我从控制台创建评论时它是 nil 和它的工作原理
  • 那么错误在哪一行?它来自控制器中的@company.reviews 吗?如果是这样,那么Company.find_by_slug 将返回 nil。
  • 是的,你是对的,但我使用 friendly_id 而不是 id,所以我猜像 @company = Company.find(params[:company_id]) 这样的东西不起作用

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    1. 如果您使用的是 Rails 4,您可能会遇到更多问题。在 create 方法的第三行中,您直接在 .create 调用中使用了不安全的参数。 Check out the Rails Guide page 关于“强参数”。

    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
      

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-22
      • 1970-01-01
      • 2011-07-27
      • 2013-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多