我正在尝试将控制器内的这两个代码合并到“create”
下class PostcommentsController < ApplicationController
def create
@micropost = Micropost.find(params[:micropost_id])
@comment = Postcomment.new(params[:postcomment])
@comment.micropost = @micropost
@comment.user = current_user
if @comment.save
redirect_to(:back)
else
render partial: 'shared/_postcomment_form', locals: { micropost: @micropost }
end
end
def create2
@discussion = Discussion.find(params[:discussion_id])
@comment = Postcomment.new(params[:postcomment])
@comment.discussion = @discussion
@comment.user = current_user
if @comment.save
redirect_to(:back)
else
render partial: 'shared/_postcomment_form', locals: { discussion: @discussion }
end
end
end
我在“创建”下尝试了两个代码并且它们有效。 我有两个模型,我将postcomment联系到:微博和讨论。 我想应用正确的“创建”,取决于它是微博还是讨论。
以下是我正在讨论的内容
<%= form_for([@discussion, @comment]) do |f| %>
<%= f.text_field :comment_content %>
<button class="btn" type="submit">
Comment
</button>
<% end %>
答案 0 :(得分:3)
我会给它一个“盲目”的尝试因为我现在无法访问我的环境所以它不会被测试代码,让我知道它是否有效或挂在某处...:
def create
model = params.has_key?(:micropost_id) ? Micropost : Discussion
@object = model.find(params[model.to_s.foreign_key.to_sym])
@comment = Postcomment.new(params[:postcomment])
@comment.write_reflection(@object)
@comment.user = current_user
if @comment.save
redirect_to(:back)
else
render partial: 'shared/_postcomment_form', locals: { model.to_s.downcase.to_sym => @object }
end
end
在你的评论模型中:
def write_reflection(object)
if object.kind_of?(Micropost)
self.micropost = object
else
self.discussion = object
end
end
答案 1 :(得分:0)
Sparda已经回答了这个问题,所以我不会重复他的回答。
但我想告诉你,这是一个非常糟糕的主意。这不是一种好的做事方式。您应该使用多态关联来表示与讨论和微博的评论关系。
如果将来情况发生变化,你正在为不必要的重构做好准备。
你必须问自己,你想通过结合这两个行动来实现什么目标?如果有一天你添加另一个模型怎么办?
def create
model = params.has_key?(:micropost_id) ? Micropost : Discussion
def create
model = case params
when params.has_key?(:foo) then foo
... # where do you stop?
您还必须在new
操作中重复此操作,以创建正确的对象并避免nil class
错误。
这不是一种理智的做事方式。
检查出来:http://railscasts.com/episodes/154-polymorphic-association-revised(需要订阅)
或者这个较旧但免费的剧集:http://railscasts.com/episodes/154-polymorphic-association