4

UsersProfileController имеет сильный Params, который выглядит примерно так:Сильный Params: params.permit возвращает Самовольную параметры несмотря белого список

def user_profile_params 
     params.permit(:age, :relations) 
     # yes, I am not requiring user_profile. Just permitting attributes I need. 
    end 

создать действие строит UserProfile через родитель (имеет один-и принадлежит к ассоциации)

def create 
     parent = Parent.create_guest 
     parent.build_user_profile(user_profile_params) 
     if parent.save 
     # do something 
     else 
     # handle error 
     end 
    end 

Вызывающие PARAMS в UserProfiles возвращается:

<ActionController::Parameters 
     {"age"=>"23", 
     "relations"=>"3", 
     "subdomain"=>"api", 
     "format"=>:json, 
     "controller"=>"api/v1/user_profiles", 
     "action"=>"create"} 
    permitted: false> 

Вызов user_profile_params, возвращает это:

user_profile_params: 
     Unpermitted parameters: subdomain, format 
     <ActionController::Parameters 
     {"age"=>"23", 
     "relations"=>"3", } 
     permitted: true> 

Когда запрос пост приходит, я ожидаю, чтобы быть в состоянии создать user_profile с помощью белого списка Params в user_profile_params. Вместо этого действие create в UserProfiles выходит из строя с ошибкой: Unpermitted parameters: subdomain, format.

Это не то, что я ожидал. Я ожидал, что user_profile_params будет включать только допустимые значения и игнорировать все остальные.

Я мог бы добавить :format и :subdomain в список разрешенных атрибутов, но что-то чувствует себя немного об этом.

Может кто-нибудь объяснить, что происходит/что мне не хватает?

+0

Мне кажется, что вы не проходите через этот блок создания в своем UserProfileController. –

+0

@ChrisMoody: Не уверен, что я понимаю, что вы имеете в виду. Если вы имеете в виду, что метод не вызван, то это неверно. Мог вступить в действие 'create' в UserProfileController и обнаружил, что ошибка возникает, когда' user_profile_params' вызывается в этой конкретной строке 'parent.build_user_profile (user_profile_params)'. Можете ли вы объяснить, что вы имеете в виду? – Uzzar

ответ

3

Это сообщение только предупреждение, а не ошибка/исключение. Если ваша модель не сохраняется, это по другой причине.

От strong parameters docs:

Handling of Unpermitted Keys

By default parameter keys that are not explicitly permitted will be logged in the development and test environment. In other environments these parameters will simply be filtered out and ignored.

Additionally, this behaviour can be changed by changing the config.action_controller.action_on_unpermitted_parameters property in your environment files. If set to :log the unpermitted attributes will be logged, if set to :raise an exception will be raised.

Вы можете имитировать его в консоли (rails c):

fake_params_hash = { 
    "age"=>"23", 
    "relations"=>"3", 
    "subdomain"=>"api", 
    "format"=>:json, 
    "controller"=>"api/v1/user_profiles", 
    "action"=>"create" 
} 

permited_params = ActionController::Parameters.new(fake_params_hash).permit(:age, :relations) 
#=> Unpermitted parameters: subdomain, format <== warning logged to the console 
#=> <ActionController::Parameters {"age"=>"23", "relations"=>"3"} permitted: true> 


user = User.create(permited_params) #mass assigment with permited params 

#check if there are errors 
puts user.errors.messages if user.errors.any? 

Как вы можете видеть, это сообщение не брошенная User.create, но когда .permit вызывается.

+1

Вы правы. На самом деле пришел к выводу, что ошибка была вызвана валидацией на модели User. Спасибо, что нашли время, чтобы ответить :) – Uzzar

+0

@Uzzar приветствую вас! Удачи с вашим проектом – mrlew