наследование в контроллерах - PullRequest
0 голосов
/ 12 февраля 2009

Я использую наследование в моей модели. Событие имеет разные типы:

Event < activity
Event < training
Event < game

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

game.user_id = session[:user_id]
training.user_id = session[:user_id]
activity.user_id = session[:user_id]

Я хочу избежать записи @ game.user_id = session [: user_id], ..., ... в каждом методе создания в контроллере активности, игры и обучения

Кто-то знает, как лучше всего подойти к этому.

Спасибо

Ответы [ 3 ]

3 голосов
/ 12 февраля 2009

Возможно, вы ищете фильтр before_filter, который находится в вашем ApplicationController? Затем в каждом контроллере вы можете установить before_filter для запуска при создании действий.

ApplicationController
  def set_user_ids
    game.user_id = session[:user_id]
    training.user_id = session[:user_id]
    activity.user_id = session[:user_id]
  end
  ...
end

OneController < ApplicationController
  before_filter :set_user_ids, :only => [:create]
  ...
end

TwoController < ApplicationController
  before_filter :set_user_ids, :only => [:create]
  ...
end
0 голосов
/ 16 февраля 2009

Как правило, вы захотите использовать встроенную область видимости, предоставляемую Rails. Просто чтобы выяснить, что @Radar уже написал:

class ApplicationController < ActionController::Base
  before_filter :find_current_user

  private
    def find_current_user
      @current_user = User.find( session[:user_id] )
    end
end

class EventsController < ApplicationController
  def create
    @event = @current_user.events.build( params[:event] )
    @event.save!
  end
end

Предполагается, что вы настроили ассоциации в вашей модели:

class User
  has_many :events
end

class Event
  belongs_to :user
end

Это также довольно удобный механизм, если вам нужно ограничить то, что пользователь может видеть или редактировать:

class EventsController < ApplicationController
  def index
    @events = @current_user.events # only fetch current users events
  end

  def update
    @event = @current_user.events.find( params[:id] ) # can't update other user's events
    @event.update_attributes!( params[:event] )
  end
end
0 голосов
/ 15 февраля 2009

Не используйте game.user_id, вместо этого вы можете сделать это:

game = current_user.games.build(params[:game])
if game.save
  # do something
else
  # do something else
end

Повторите и для других контроллеров!

Также может помочь справочник по ассоциациям .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...