Rails 5 - 实现可重用的评论模型 - 视图?

时间:2016-10-03 10:01:50

标签: ruby-on-rails ruby-on-rails-5

在我正在构建学习RoR的应用程序中,我有类似的情况,例如question。现在我的问题是如何改变我对此的看法?

我有一个Annotation模型,一个Document模型和一个Comment模型。如果我切换到多态关联,以便我的注释和我的文档可以有注释,如何进行视图(在部分中)?

这是当前的部分:

<%= simple_form_for([@annotation, @annotation.comments.build], html: { class: 'form-vertical', multipart: true }) do |f| %>

   <%= f.error_notification %>

   <%= f.input :commenter, :as => :hidden, :input_html => { :value => current_user.username }, label: false %>

   <%= f.input :body, placeholder: 'comment', focus: true, label: false %>

   <%= f.button :submit, 'Save' %>

<% end -%>

更新

进一步研究并在我的注释视图中进行了如下更改:<%= render 'comments/form', :object => @annotation%>

并在我的文档视图中如下:<%= render 'comments/form, :object => @document %>

并在我的部分调整了这个:

<%= simple_form_for([object, object.comments.build], html: { class: 'form-vertical', multipart: true }) do |f| %>

现在,在向文档添加注释时,我的CommentsController中出现错误 - 逻辑是:-)。

  

在CommentsController #create中创建ActiveRecord :: RecordNotFound

这是我目前的评论控制器:

class CommentsController < ApplicationController

  def create
    @annotation = Annotation.find(params[:annotation_id])
    @comment = @annotation.comments.create(comment_params)
    redirect_to annotation_path(@annotation)
  end

  def destroy
    @annotation = Annotation.find(params[:annotation_id])
    @comment = @annotation.comments.find(params[:id])
    @comment.destroy
    redirect_to annotation_path(@annotation)
  end

  private
    def comment_params
    params.require(:comment).permit(:commenter, :body)
  end
end

如何(最好)改变这个?

更新

我现在已经为另一个名为&#34; tag&#34;的对象/模型/类实现了相同的功能。使用:as => :tagable我可以为Annotation创建,列表等,但我无法删除。

列表(作为部分)用:

调用
<%= render 'tags/tag_list', :object => @annotation %>

或:

<%= render 'tags/tag_list', :object => @document %>

打开注释/文档记录时,会抛出错误:

  

未定义的方法`对象&#39;为#   你的意思是?的object_id

......在这一行:

<td><%= link_to '', [tag.object, tag], method: :delete, data: { confirm: 'Please confirm deletion!' }, :class => "glyphicon glyphicon-remove" %></td>

我应该改变什么?

找到解决方案

将行更改为

<td><%= link_to '', [object, tag], method: :delete, data: { confirm: 'Please confirm deletion!' }, :class => "glyphicon glyphicon-remove" %></td>

1 个答案:

答案 0 :(得分:1)

你必须以某种方式获取正确的评论。最简单的解决方案是这样的:

def create
  commentable = detect_commentable
  commentable.comments.create(comment_params)
  redirect_to commentable_path(commentable)
end

private

def commentable_path(commentable)
  case commentable
  when Document
    document_path(commentable)
  when Annotation
    annotation_path(commentable)
  else
    fail 'unknown commentable'
  end
end

def detect_commentable
  if params[:annotation_id]
    Annotation.find(params[:annotation_id])
  elsif params[:document_id]
    Document.find(params[:document_id])
  else
    fail 'Commentable not found'
  end
end

这显然不是最好的代码(因为维护要求,一件事)。但这应该让你开始。