Основная причина безопасности существования как строгих параметров, так и attr_accessible заключается в том, что в модели есть определенные атрибуты, которые нельзя изменять, если только это не явное намерение. вашего кода.
Небольшая разница между ними заключается в том, в какой перспективе они выполняют свою работу.
StrongParameters ориентирован на вариант использования: каждое действие контроллера можно настроить, чтобы разрешить или запретить определенные параметры с учетом любых условий. Полная гибкость.
attr_accessible придерживается другой точки зрения. Вместо того, чтобы сосредотачиваться на варианте использования, он сосредотачивается на ролях. Так, например, в зависимости от роли пользователя определенные атрибуты могут быть изменены или нет.
Способ использования StrongParameters заключается в применении ключевых слов require
и permit
к хешу параметров.
require
заявляет, что ключ должен присутствовать в хэше params. require
вызовет исключение, если такого ключа нет.
permit
указывает, что поле разрешено. Любой недопустимый ключ будет удален из хэша и, следовательно, не будет передан в модель посредством массового назначения.
Модель
class League
attr_protected :final_price # Nobody can mass-assign the final price
attr_accessible :winner_name, :as => :jury
end
И контроллер
class LeaguesController < ApplicationController
Эти два действия используют StrongParameters.
# A common user can create a league
def create
league = League.new(league_params)
league.final_price = 1000
league.save
redirect_to(league)
end
# But only the admin can publish a league
def publish_league
league = League.find(params[:id]
league.update_attributes(league_params_as_admin)
end
Здесь используется attr_accessible
def publish_the_winner
league = League.find(params[:id]
# We would expect the current_user.role to return :jury.
league.assign_attributes(params[:league], :as => current_user.role)
end
private
def league_params
params.require(:league).permit(:name)
end
def league_params_as_admin
params.require(:league).permit(:name, :status)
end
end
По моему опыту:
Используйте гибкость сильных параметров, чтобы точно настроить, какие атрибуты могут быть назначены массово в каждом из ваших контроллеров.
Используйте вездесущность attr_accesible, чтобы убедиться, что определенные атрибуты не могут быть назначены массово, несмотря ни на что. Например, в задаче восстановления вы можете передать ввод пользователя в качестве параметра. Вы можете проверить, что некоторые атрибуты не назначаются массово, используя attr_accesible.
Больше информации:
http://api.rubyonrails.org/classes/ActiveModel/MassAssignmentSecurity/ClassMethods.html
https://github.com/rails/strong_parameters
person
Nerian
schedule
14.04.2013