如何在一种方法下组合这两个代码? (铁轨3)

时间:2013-05-09 04:11:10

标签: ruby-on-rails ruby

我正在尝试将控制器内的这两个代码合并到“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 %>

2 个答案:

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