Я не вижу ничего плохого в вашей текущей реализации. При этом, если вы хотите повторно использовать эти разрешения атрибутов в другом контроллере (например, Api :: PostsConrtoller), одним из способов DRY это будет извлечение кода в его собственный класс. Это подход Райан Бэйтс, используемый в Railscast about Strong Parameters (примечание: требуется учетная запись Pro).
# app/models/permitted_params.rb
class PermittedParams < Struct.new(:params, :user)
def post
if user && user.admin?
params.require(:post).permit(:title, :text, :date, :user_id)
else
params.require(:post).permit(:title, :text, :date)
end
end
end
Вы можете создать экземпляр этого класса внутри ApplicationController
# app/controllers/application_controller.rb
def permitted_params
@permitted_params ||= PermittedParams.new(params, current_user)
end
, а затем использовать его в любом контроллере, где вам нужно, что разрешение логика без дублирования логики.
# app/controllers/posts_controller.rb
def update
@post = Post.find(params[:id])
if @post.update_attributes(permitted_params.post)
...
else
...
end
end
Что действительно приятно об этом решении является то, что вы можете также использовать его для DRY-ваши взгляды, слегка изменив PermittedParams
класс.
# app/models/permitted_params.rb
class PermittedParams < Struct.new(:params, :user)
def post
params.require(:post).permit(*post_attributes)
end
def post_attributes
if user && user.admin?
[:title, :text, :date, :user_id]
else
[:title, :text, :date]
end
end
end
и подвергая метод permitted_params
как помощник вида.
# app/controllers/application_controller.rb
def permitted_params
@permitted_params ||= PermittedParams.new(params, current_user)
end
helper_method :permitted_params
Наконец, используйте его в своем представлении, чтобы показать/скрыть поля формы.
# app/views/posts/edit.html.erb
<% if permitted_params.post_attributes.include? :user_id %>
# show the user_id field
<% end %>
Cancan - это крутой камень, который ограничивает доступ к действиям контроллера и действиям модели. Можете ли вы дать код, как использовать его с сильными параметрами, чтобы ограничить ввод пользователя? – BroiSatse