Разрешение declarative_authorization для нового, но связанного идентификатора объекта равно нулю

У меня есть организация, в которой есть_много филиалов, и миссия, в которой есть_одна организация.

Итак, я могу сделать это:

m = Mission.first
m.organization.affiliations

Пользователь также имеет_много связей, поэтому я могу сделать:

u = User.first
u.affiliations

В declarative_authorization я хочу, чтобы пользователь мог управлять миссией, если он связан с организацией миссии. У меня есть это:

has_permission_on :missions, :to => [:manage] do
  if_attribute :organization => { :affiliations => intersects_with { user.affiliates.type_admin } }
end

Но я получаю эту ошибку:

Permission denied: new not allowed for #<User id: 2, firstname: "Miguel", lastname: "Alho", email: "[email protected]", birthday: "2010-07-05 20:24:00", crypted_password: "...", password_salt: "...", persistence_token: "...", perishable_token: "...", created_at: "2010-03-05 20:25:34", updated_at: "2010-03-30 15:45:36"> on #<Mission id: nil, user_id: nil, organization_id: nil, name: nil, objectives: nil, created_at: nil, updated_at: nil>

Миссия и организация нулевые. Я думаю, это потому, что в новой версии Mission.organization не существует.

На контроллере миссии у меня есть это:

  def new
    if(params[:organization_id])
      session[:organization_id] = params[:organization_id]
      @mission = Organization.find_by_id(params[:organization_id]).missions.build
    end  
  end

person Victor Martins    schedule 30.03.2010    source источник


Ответы (1)


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

Из того, что я понял из ваших примеров кода, вы хотите, чтобы только пользователи, связанные с организацией миссии, могли управлять этой миссией. Кроме того, этот пользователь должен иметь тип администратора. В прошлом я создал отношение has_many в вашей организационной модели с несколькими дополнительными условиями, которые отфильтровывают принадлежность, не относящуюся к типу admin:

has_many :admins, :source => :user, :through => :affiliations, :conditions => "affiliations.type = 'admin'"

Затем в вашем author_rules.rb вы добавляете это правило:

has_permission_on :missions, :to => [:manage] do { if_attribute :organization => {:admins => contains {user}}}
person schickm    schedule 17.04.2010
comment
Спасибо, это было очень полезно! - person jspooner; 23.06.2010