입력

2012-06-15 2 views
2

이 정말 n00b 질문을 할 수있다 살균,하지만 PARAMS의 목록이 잔뜩 포함되어있는 경우 즉, 당신을 "소독"할 수있는 가장 좋은 방법은 무엇입력

params = {"controller"=>"api1/users", "action"=>"create"} 

접근 속성 아니라고 액세스 할 수있는 속성 만 포함하도록 (듯이)합니다.

["", "email", "password", "fb_token", "fb_id", "fb_name", "first_name", "last_name", "gender" 

또 다른 가능한 방법이있을 것입니다 : 다음 나에게 접근 속성의 목록을 제공하고

User._accessible_attributes[:default].entries 

는 만 PARAMS을 통과 : 나는 현재의 생각 현재의 방법은하는 것입니다

def clean_params #ANTIPATTERN 
    params.delete(:controller) 
    params.delete(:action) 
    end 

하지만이 또한 안티 패턴 것 같은 느낌이 든다 ...

나는 '당신이 알고 params [: user]와 같은 방식으로 접근 가능한 매개 변수를 얻으려고합니다. 그러나 이것이 API이기 때문에 url에있는 것들만 전달할 수 있으면 좋을 것입니다.

감사합니다.

+3

레일즈가 이미 ['attr_accessible'] (http://api.rubyonrails.org/classes/ActiveModel/MassAssignmentSecurity/ClassMethods.html#method-i-attr_accessible)을 시행합니까? – sarnold

답변

2

Rails 매개 변수 래퍼가 자동으로이 작업을 수행합니다. 즉, 최상위 레벨에서 매개 변수를 받아들이고 사용자 모델에 액세스 할 수없는 모든 것을 필터링하여 편리하게 사용자를 그룹화합니다 (예 : :user). 내부적으로는 수행 한 것과 비슷한 accessible_attributes을 사용합니다. API를 사용하는 사용자는 속성을 그룹화 할 필요가 없습니다. 레일이 매개 변수를 컨트롤러 작업에 전달하기 전에 레일이이를 수행합니다.

기본적으로 JSON 요청에 사용하도록 설정되어 있지만 initializers/wrap_parameters.rb을 수정하여 확장 할 수 있습니다. 또는 컨트롤러의 wrap_parameters method을 사용하여 컨트롤러별로 동작을 조정할 수 있습니다.

매개 변수 살생의 레일 스킴이 4.0에서 변경되어 모델에서 컨트롤러쪽으로 기울어 질 가능성이 있습니다. 여러분은 앞으로의 것들을 미리 볼 수있는 strong_parameters gem의 개발을보고 싶어 할 것입니다.

2

이렇게 할 수 있습니다 ... 이것은 컨트롤러에서 원하는 매개 변수에서만 감지됩니다. 크레딧 : dhh's gist

class UserController < ApplicationController 
    respond_to :html 

    def create 
    respond_with User.create(user_params) 
    end 

    private 
    def user_params 
    params[:user].slice(:email, :first_name, :last_name) 
    end 

end