Rails 5 - 实施可重复使用的评论模型 - 意见?
Rails 5 - implement reusable comment model - views?
在我为学习 RoR 而构建的应用程序中,我遇到了类似的情况 question。现在我的问题是如何改变我对此的看法?
我有一个注释模型、一个文档模型和一个评论模型。如果我切换到多态关联,使我的注释和我的文档可以有评论,如何进行视图(部分)?
这是当前部分:
<%= 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 中出现错误 - 符合逻辑的是:-)。
ActiveRecord::RecordNotFound in CommentsController#create
这是我当前的 CommentsController:
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
如何(最好)改变这个?
更新
我现在已经使用 :as => :tagable
为另一个名为 "tag" 的 object/model/class 实现了相同的功能,我可以为注释创建、列出等,但我无法删除。
列表(作为部分)被称为:
<%= render 'tags/tag_list', :object => @annotation %>
或:
<%= render 'tags/tag_list', :object => @document %>
打开注释/文档记录时,抛出错误:
undefined method `object' for #
Did you mean? 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>
您必须以某种方式获取正确的评论。最简单的解决方案是这样的:
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
这显然不是最好的代码(一方面是因为维护要求)。但这应该可以帮助您入门。
在我为学习 RoR 而构建的应用程序中,我遇到了类似的情况 question。现在我的问题是如何改变我对此的看法?
我有一个注释模型、一个文档模型和一个评论模型。如果我切换到多态关联,使我的注释和我的文档可以有评论,如何进行视图(部分)?
这是当前部分:
<%= 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 中出现错误 - 符合逻辑的是:-)。
ActiveRecord::RecordNotFound in CommentsController#create
这是我当前的 CommentsController:
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
如何(最好)改变这个?
更新
我现在已经使用 :as => :tagable
为另一个名为 "tag" 的 object/model/class 实现了相同的功能,我可以为注释创建、列出等,但我无法删除。
列表(作为部分)被称为:
<%= render 'tags/tag_list', :object => @annotation %>
或:
<%= render 'tags/tag_list', :object => @document %>
打开注释/文档记录时,抛出错误:
undefined method `object' for # Did you mean? 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>
您必须以某种方式获取正确的评论。最简单的解决方案是这样的:
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
这显然不是最好的代码(一方面是因为维护要求)。但这应该可以帮助您入门。