我有以下模型:User
,Product
和Comment
。用户可以添加,编辑和删除产品的注释。我已经成功设置了添加和删除功能,现在我正在努力编辑,出于某种原因,它给我带来了很多困难。
当我点击edit comment
链接时,我当前的代码会返回此错误:
/ products / 800 / comments / 8 / edit
中的NoMethodErrornil的未定义方法`comments':NilClass
以下是我的评论模型的样子:
# id :integer not null, primary key
# body :text
# created_at :datetime not null
# updated_at :datetime not null
# user_id :integer
# product_id :integer
class Comment < ActiveRecord::Base
belongs_to :user
belongs_to :product
# validations ...
end
在User
模型中,我有has_many :comments
和Product
- has_many :comments, dependent: :destroy
。
在我的routes.rb
文件中,我有以下嵌套资源:
resources :products, only: [:show] do
resources :comments, only: [:create, :edit, :update, :destroy]
end
我的ProductsController
有唯一的方法show
而没有别的,这就是它的样子:
def show
product = Product.find(params[:id])
photos = ProductsPhoto.where(product: product)
case product.products_category.name
when 'Violin'
@product = [product, Violin.where(product: product).first, photos]
when 'Guitar'
@product = [product, Guitar.where(product: product).first, photos]
when 'Saxophone'
@product = [product, Saxophone.where(product: product).first, photos]
when 'Piano'
@product = [product, Piano.where(product: product).first, photos]
end
@comment = Comment.new
@comments = Comment.where(product_id: product.id).order('created_at DESC')
end
现在这是我的CommentsController
,其create
,edit
,update
和destroy
:
class CommentsController < ApplicationController
def create
@product = Product.find(params[:product_id])
@comment = @product.comments.create(comment_params)
@comment.user_id = current_user.id
if @comment.save
redirect_to @product, notice: 'Comment Created!'
else
redirect_to @product, notice: 'Something went wrong...'
end
end
def show
end
def edit
@product = Product.find(params[:product_id])
@comment = @product.comments.find(params[:id])
end
def update
@product = Product.find(params[:product_id])
@comment = @product.comments.find(params[:id])
respond_to do |format|
if @comment.update_attributes(comment_params)
format.html do
redirect_to [@comment.product, @comment], notice: 'Comment Updated!'
end
else
format.html { render action: 'edit', notice: 'Something went wrong...' }
end
end
end
def destroy
@product = Product.find(params[:product_id])
@comment = @product.comments.find(params[:id])
@comment.destroy!
redirect_to @product, notice: 'Comment Deleted!'
end
private
def comment_params
params.require(:comment).permit(:body)
end
end
我的_form
视图位于views/products/_form.html.erb
,如下所示:
<%= simple_form_for([@product[0], @product[0].comments.build]) do |f| %>
<%= f.error_notification %>
<%= f.input :body, required: true, placeholder: 'Type in your comment...', input_html: { class: 'form-control'}, label: false %>
<%= f.button :submit, class: 'btn btn-primary btn-block' %>
<% end %>
在views/products/show.html.erb
我渲染部分评论,并且有用于销毁和编辑评论的链接,它们看起来像这样:
<%= link_to edit_product_comment_path(comment.product, comment) do %>
<span class="glyphicon glyphicon-pencil"></span>
<% end %>
<%= link_to [comment.product, comment], method: :delete do %>
<span class="glyphicon glyphicon-remove"></span>
<% end %>
删除链接正常,编辑链接没有。
也许我错了路线,这是评论的路线:
product_comments POST /products/:product_id/comments(.:format) comments#create
edit_product_comment GET /products/:product_id/comments/:id/edit(.:format) comments#edit
product_comment PATCH /products/:product_id/comments/:id(.:format) comments#update
PUT /products/:product_id/comments/:id(.:format) comments#update
DELETE /products/:product_id/comments/:id(.:format) comments#destroy
在我的views/comments/edit.html.erb
我渲染相同的表单:
<%= render 'products/form' %>
然而,当我点击编辑链接时,我收到以下错误:
/ products / 800 / comments / 8 / edit
中的NoMethodErrornil的未定义方法`comments':NilClass
在_form.html.erb
的第一行。
我希望我已经提供了足够的信息来描述这个问题。
那么,请你帮我解决一下编辑评论的问题吗?
答案 0 :(得分:1)
今天早上太早......
这是不正确的:
<%= simple_form_for([@product, @product.comments.build]) do |f| %>
尝试:
<%= simple_form_for [@comment.product_id, @comment], url: product_comment_path(@comment.product_id, @comment) do |f| %>
添加了
部分(所有这一切都假设我们正在使用单个@comment,而不是@comments集合。根据您对删除工作的评论。)
要回复您的评论,是的,您绝对需要单独的表格,以及#34; new&#34;与&#34;编辑&#34;你的孩子表的行动,评论。
Form&#34; new&#34;命名约定是comments / _form.html.erb,&#34;编辑&#34;表格将是评论/ _form_edit.html.erb,
我会打开&#34; new&#34;评论的行动表格......
<%= simple_form_for([:product, @comment]) do |f| %>
&#34;编辑&#34;行动......
<%= simple_form_for [@comment.product_id, @comment], url: product_comment_path(@comment.product_id, @comment) do |f| %>
抱歉,我忘记了以前版本的网址,我已更新上面的代码段以反映此更改。警告:可能还有其他方法来构建此链接,但这就是我实现产品(父级)带有评论/评论(许多孩子)的情况。
嵌套属性
在对您的评论的进一步回复中,我相信您可以通过在表单中使用嵌套属性来实现您正在寻找的一些内容。这是另一个话题。我会得到新的/编辑形式的简单案例,然后增加复杂性。