我正在尝试为公司页面创建一个评论模型。为此,我有:
型号
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])
您可能会发现一些有用的东西:
如果您正在使用Rails4,您可能会遇到另一个问题。在create方法的第三行中,直接在.create调用中使用不安全的params。查看"strong params"上的Rails指南页面。
如果您实现了上面提到的强参数,那么您可能应该故意从允许的参数列表中省略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.rb def show @company = Company.find(params[:id] # add this line below... @review = Review.new end
我希望这能有所帮助。