我正在实施自己的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" %>
答案 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)
你是对的,没有理由重复那种事情。这种事情可以在三个地方中任意一个(假设它只在一个控制器中使用):
在同一控制器中的私有方法中。您可以从每个操作中调用该方法,或在before_action
在该控制器的帮助器中,使用一个接受params [:vote]并返回可投票的方法。
使用类似于helper方法的方法,在app / models或您自己的应用程序/任何目录中创建一个普通的ruby类。当你有这些方法中的一些时,这通常更有意义,并且你想要一个比帮助者更多的OO解决方案。