编写一个在我的帖子视图和投票控制器中都可用的方法?

时间:2012-12-02 08:19:32

标签: ruby-on-rails

我有以下内容(Vote作为与Post的多态关联):

votes_controller.rb:

if already_voted?
  @vote = @votable.votes.find_by_user_id(current_user.id)
  @vote.destroy
end

帖/ _vote_form.html.erb:

<div class="vote-form">      
  <% if @post.votes.exists?(:user_id => current_user.id) %>
    <% if @post.votes.find_by_user_id(current_user.id).polarity == 1 %>
      <%= form_for ([@post, @post.votes.find_by_user_id(current_user.id)]),
                                                           method: :delete,
                                                           remote: true do |f| %>
(etc).

我想在后视图和投票控制器中替换votes.find_by_user_id(current_user.id),如下所示:

  def vote_by_current_user
    self.votes.find_by_user_id(current_user.id)
  end

所以他们变得更加可以这样:>

@vote = @votable.vote_by_current_user<% if @post.vote_by_current_user.polarity == 1 %>

我不确定如何在这两种方法上使用该方法。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

一件事:你不应该在你的模型中做任何与会话相关的事情(它打破了MVC模式),所以你已经以正确的方式做了。

你可以采取哪些措施来改善这种情况:从current_user开始。

 class User < ActiveRecord::Base
   def self.polarized_vote_for( votable, polarity = 1 )
     votes.where( polarity: polarity ).find_by_votable_id( votable.id )
   end

只记得存储调用返回的关系以避免多次查询:

 <% if vote = current_user.polarized_vote_for( @post ) %>
   <%= form_for [@post, vote] do |f| %>
     # etc.