2012-12-15 10 views
6

W moim User modelu, mam to:Jak udostępnić niektóre atrybuty tylko użytkownikom mającym określoną rolę?

attr_accessible :role_ids, :as => :admin 

Ale to nie wydają się działać.

Chcę, aby ten konkretny atrybut był dostępny tylko wtedy, gdy current_user.can?(:edit, Role) - tj. Tylko użytkownicy mający rolę admin lub superadmin powinni mieć możliwość uzyskania dostępu do tych atrybutów.

Jak to zrobić?

Edytuj 1: Używam Devise, CanCan & Rolify.

+0

Co słychać w głosowaniu i na zakończenie głosowania? Chcesz zaoferować wyjaśnienie? – marcamillion

+2

Co zostało zainstalowane? Czy korzystasz z usługi Cancan i wymyślasz? Prawdopodobnie brak informacji. – simonmorley

+0

@simonmorley Tak, CanCan & Devise. Przepraszamy, zaktualizuje pytanie. – marcamillion

Odpowiedz

9

Tak jak powiedziałem, uważamy, że najlepszym sposobem ograniczenia atrybutów do określonych ról jest użycie klejnotu, który DHH wprowadził niedawno. To również będzie częścią Rails4 na szczęście.

Nawet jeśli nie pasuje, dobrze jest rozpocząć integrację zasad, ponieważ ułatwi to aktualizację Railsów od 3 do 4.

Jeśli masz członkostwo Railscasts Pro, Ryan Bates wykonał na nim kolejny fantastic tutorial.

W skrócie, oto co jest zalecane w tym Railscast.

Po zainstalowaniu klejnotu, usuń attr_accessible ze swojego modelu.

Dodaj to do inicjowania obiektu:

ActiveRecord::Base.send(:include, ActiveModel::ForbiddenAttributesProtection) 

zmień swoje działania aktualizacji w kontrolerze ::

def update 
    @topic = Topic.find(params[:id]) 
    if @topic.update_attributes(topic_params) 
    redirect_to topics_url, notice: "Updated topic." 
    else 
    render :edit 
    end 
end 

utworzyć prywatną metody w kontrolerze:

def topic_params 
    if current_user && current_user.admin? 
    params[:topic].permit(:name, :sticky) 
    else 
     params[:topic].permit(:name) 
    end 
    end 

W Twojej sytuacji, tak jak my, musisz zmienić metodę topic_params, aby użyć swoich ról.

W RailsCast jest jeszcze kilka sugestii i naprawdę warte 9 $! (Nie jestem w żaden sposób związany z witryną, jest to dla nas bezcenne)

Daj mi znać, jeśli to pomoże.

+0

Dziękuję bardzo za to. To wygląda na to, czego potrzebuję. Właściwie to trzymałem się wersji Pro RailsCast, ale ostatnio kupiłem abonament i okazało się to bardzo pomocne. Po prostu robi krótki przegląd obu klejnotów 'strong_parameters', a to RailsCast wygląda na to, czego potrzebuję. – marcamillion

+0

To na początku więcej pracy, niż można by się spodziewać, ale warto na dłuższą metę. Powodzenia. S – simonmorley

+0

Tak, właśnie o tym myślałem ... o veeyy ... to wygląda jak ból głowy. Ale nie mam wyboru - a dostępność RailsCast znacznie ułatwia zarządzanie. – marcamillion

0

w moim modelu użytkownika

class User 
    attr_accessible :nickname, as: :admin 
end 

w moim konsoli szyn

User.first.update_attributes!({nickname: "uschi"}) 
# WARNING: Can't mass-assign protected attributes: nickname 

User.first.update_attributes!({nickname: "uschi"}, {as: :admin}) 
# true 

UPDATE

może mam głupie, aby uzyskać swój problem, ale po prostu zrobić

if current_user.can?(:edit, Role) 
    user.update_attributes!({nickname: "uschi"}, {as: :admin}) 
else 
    first.update_attributes!({nickname: "uschi"}) 
end 

i tam są p znacznie mądrzejszy sposób robienia tego ...

+0

Potrzebuję tego do pracy z rolami określonymi w moim modelu 'Ability' - dla CanCan & Rolify. Z ': as =>: admin' tak nie jest. – marcamillion

+0

Tak, to nie jest w porządku z Cancan, ponieważ wygląda na to, że tworzysz wartość logiczną dla administratora. – simonmorley

+0

Yeh ... @imonmorley jest na miejscu. Próbuję ograniczyć dostęp do niektórych atrybutów modelu za pomocą CanCan & Rolify. Sugerowałeś coś, co zrobiłbyś na kontrolerze lub w widoku lub coś takiego. Muszę to zrobić w moim modelu. – marcamillion

Powiązane problemy