0

我试图在“创建”下将控制器内的这两个代码合并为一个

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 关联到:micropost 和讨论。我想应用正确的“创建”,具体取决于它是微博还是讨论。

这是我在讨论中使用的内容

<%= form_for([@discussion, @comment]) do |f| %>
<%= f.text_field :comment_content %>
<button class="btn" type="submit">
Comment
</button>
<% end %>
4

2 回答 2

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
于 2013-05-09T04:30:00.757 回答
0

斯巴达已经回答了这个问题,所以我不会重复他的回答。

但我想告诉你,这是一个非常糟糕的主意。这不是做事的好方法。您应该使用多态关联来表示与讨论和微博的评论关系。

如果将来情况发生变化,您正在为不必要的重构做好准备。

你必须问自己,通过结合这两个动作,你想达到什么目的?如果有一天你添加另一个模型怎么办?

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

于 2013-05-09T19:08:20.233 回答