我正在尝试为公司页面创建评论模型。为此,我有:
模型
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
答案 0 :(得分:1)
而不是@company = Company.find_by_slug(params[:id])
使用此代码@company = Company.friendly.find(params[:company_id])
答案 1 :(得分:1)
您可能会发现一些有用的东西:
如果您使用的是Rails 4,则可能会遇到其他问题。在create方法的第三行中,您在.create调用中直接使用不安全的params。 Check out the Rails Guide page on&#34;强大的参数&#34;。
如果你实现了如上所述的强参数,你应该故意省略允许的参数列表中的company_id字段。
假设允许您的用户为您系统中的任何公司撰写评论,您可以更简单地将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
我希望这会有所帮助。