2013-07-13 4 views
1

предыдущих рельсов 4 я имел в моделиRails 4, сделать атрибут труднодоступные

class User < ActiveRecord::Base 
    attr_accessible :name, :email, :password, :password_confirmation 

    ... 
end 

Но теперь strong_parameters заменил protected_attributes так я комментирую его и использовать permit.

Теперь я обнаружил, что могу получить доступ к атрибуту, не допуская его.

В rails c мне удалось это сделать:

2.0.0p247 :002 > User.new(admin: "1") 
=> #<User id: nil, name: nil, email: nil, created_at: nil, updated_at: nil, password_digest: nil, remember_token: nil, admin: true> 

2.0.0p247 :016 > user = User.new(name: 'Nir', email: '[email protected]', password: 'foobar', password_confirmation: 'foobar', admin: "1") 
=> #<User id: nil, name: "Nir", email: "[email protected]", created_at: nil, updated_at: nil, password_digest: "$2a$10$xVnY8ydd5SoaLVipK5j4Del40FrOmu4bKypGjBEwvms7...", remember_token: nil, admin: true> 

Когда очевидно, что я не должен быть в состоянии установить и изменить атрибут администратора. Только user.toggle(:admin) должен уметь.

Так что же я не понимаю или должен поступать правильно. А как сделать этот тест проход:

describe "accessible attributes" do 
    it "should not have allow access to admin" do 
     expect do 
     User.new(admin: "1") 
     end.to raise_error(ActiveModel::MassAssignmentSecurity::Error) 
    end 
    end 

ответ

1

Чтобы запретить пользователь установок admin свойства, вы должны не добавить его в качестве параметра метода permit.

params.require(:user).permit(:name, :whatever_else_you_allow) 

Ключевые слова в этом являются: params (она имеет дело с параметрами) и permit (вы говорите рельсы, какие свойства позволяют).

Strong Parameters будет запрещать использование параметров Action Controller в массовом назначении активной модели до тех пор, пока они не будут включены в белый список. В вашем тесте, однако, вы задали объект недвижимости непосредственно на модели. Ничто не мешает вам это делать.

+0

У меня есть и использовать 'разрешение' без' admin'. Должно быть, этого достаточно? Есть ли способ предотвратить прямое использование свойства? Если это так, мне нужно его использовать? – Nir

+0

Этого достаточно, да. –

Смежные вопросы