减肥多态控制器;逻辑在哪里?

时间:2015-06-15 15:22:51

标签: ruby-on-rails polymorphism

我正在实施自己的RESTful投票系统。 '问题'和'答案'都是可以投票的。投票已创建,更新和删除。

当对可投票的操作进行操作时,可投票的类将作为参数传递。控制器需要查看votable_type以检索正确的可投票对象,以便将其传递给部分。

目前我在我的votes_controller中有这个逻辑:

if params[:vote][:votable_type] == 'Question'
  @votable = Question.find(params[:vote][:votable_id])
elsif params[:vote][:votable_type] == 'Answer'
  @votable = Answer.find(params[:vote][:votable_id])
end

每个控制器操作都会重复。 它真正属于哪里?我怎样才能干掉这个控制器?

更新:这是我的upvote按钮:

<%= link_to "", votes_path(vote: {
                                    votable: votable,
                                    votable_type: votable.class,
                                    votable_id: votable.id,
                                    value: "upvote"
                                  }),
                          method: :post,
                          remote: :true,
                          class: "upvote" %>

2 个答案:

答案 0 :(得分:0)

@vote = Vote.find(:id)  #it depends of what is your params[:vote]
@votable = @vote.votable # it will return parent of your vote

http://guides.rubyonrails.org/association_basics.html#polymorphic-associations

您可以将上面的代码包装在私有方法中,然后在您的操作中使用它,即:

....
def update
  votable.update(...)
end

private

def votable
  @votable ||= Vote.find(:id).votable
end

答案 1 :(得分:0)

你是对的,没有理由重复那种事情。这种事情可以在三个地方中任意一个(假设它只在一个控制器中使用):

  1. 在同一控制器中的私有方法中。您可以从每个操作中调用该方法,或在before_action

  2. 中列出需要它的操作
  3. 在该控制器的帮助器中,使用一个接受params [:vote]并返回可投票的方法。

  4. 使用类似于helper方法的方法,在app / models或您自己的应用程序/任何目录中创建一个普通的ruby类。当你有这些方法中的一些时,这通常更有意义,并且你想要一个比帮助者更多的OO解决方案。