Rails 4.使用嵌套资源设置注释编辑功能

时间:2015-08-30 12:48:56

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

我有以下模型:UserProductComment。用户可以添加,编辑和删除产品的注释。我已经成功设置了添加和删除功能,现在我正在努力编辑,出于某种原因,它给我带来了很多困难。

当我点击edit comment链接时,我当前的代码会返回此错误:

  

/ products / 800 / comments / 8 / edit

中的NoMethodError      

nil的未定义方法`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 :commentsProduct - 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,其createeditupdatedestroy

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

中的NoMethodError      

nil的未定义方法`comments':NilClass

_form.html.erb的第一行。

我希望我已经提供了足够的信息来描述这个问题。

那么,请你帮我解决一下编辑评论的问题吗?

1 个答案:

答案 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| %>

抱歉,我忘记了以前版本的网址,我已更新上面的代码段以反映此更改。警告:可能还有其他方法来构建此链接,但这就是我实现产品(父级)带有评论/评论(许多孩子)的情况。

嵌套属性

在对您的评论的进一步回复中,我相信您可以通过在表单中​​使用嵌套属性来实现您正在寻找的一些内容。这是另一个话题。我会得到新的/编辑形式的简单案例,然后增加复杂性。