Два или более контроллеров, использующих одно и то же голосующее действие (только класс модели различается) - как создать миксин для включения во все контроллеры? - PullRequest
3 голосов
/ 25 февраля 2011

Я новичок в rails и пытаюсь создать общий код и повторно использовать его на нескольких контроллерах.В основном я использую драгоценный камень thumbs_up, который позволяет некоторым моделям выступать в качестве избирателей, а другие модели - избирателям (например, модель пользователя).

Представьте себе следующий сценарий:

У меня естьмодели «Вопрос-ответ».Вопрос имеет много ответов.И вопрос и ответ имеют право голоса.

Routes.rb:

resources :questions do

    resources :answers do

      member do
        get 'vote_up'
        get 'vote_down'
      end

    end

    member do
      get 'vote_up'
      get 'vote_down'
    end

  end

Я реализовал решение, в котором у каждой из моих моделей с возможностью голосования есть свои собственные контроллеры, где обрабатываются действия Vote_up и voice_down.Однако в обоих контроллерах эти действия в основном одинаковы, единственное различие заключается в том, что класс модели используется для поиска экземпляра, за который нужно голосовать.Пример:

QuestionsContoller:

  def vote_up
    @voteable = Question.find(params[:id])

    current_user.vote_exclusively_for(@voteable)  

    respond_to do |format|
      format.js { render :action => 'votes/vote_completed' }
    end
  end

AnswersContoller:

  def vote_up
    @voteable = Answer.find(params[:id])

    current_user.vote_exclusively_for(@voteable)  

    respond_to do |format|
      format.js { render :action => 'votes/vote_completed' }
    end
  end

Я хотел бы создать миксин с этим кодом для включения в оба контроллера, может кто-нибудь пролитьнекоторый свет о том, как это реализовать?Должен ли миксин определять методы голосования и голосования?Или вместо этого, должен ли mixin реализовать какой-то вспомогательный метод, который затем вызывается в методах Vote_up и Vote_down каждого контроллера?

Это лучший подход для этой проблемы или должен быть только один контроллер для обработки voice_upи акции voice_down?

Буду очень признателен за вашу помощь по этим вопросам.Большое спасибо заранее

Бруно

1 Ответ

5 голосов
/ 25 февраля 2011

Я бы лучше пошел полиморфным путем, но для вашего миксина (модуля) решение может быть таким:

Вопросы контроллера

include Voting

Модуль голосования:

module Voting
  def vote_up
    @voteable = Object.const_get(self.class.to_s.chomp('Controller').singularize).find(params[:id])
    current_user.vote_exclusively_for(@voteable)  

    respond_to do |format|
      format.js { render :action => 'votes/vote_completed' }
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...