현재 구현에 문제가없는 것으로 보입니다. 즉, 다른 컨트롤러 (예 : Api :: PostsConrtoller)에서 이러한 속성 권한을 다시 사용하려면 DRY하는 한 가지 방법은 자체 클래스에 코드를 추출하는 것입니다. Ryan Bates가 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
당신은 또한 건조까지 귀하의 의견을 약간 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