2015-07-22 2 views
0

См метода people_controller#person_params для версии коды вопроса:Rails 4: сильные параметры и массив скаляров должны быть указаны последними на разрешении?

# person.rb 
class Person < ActiveRecord::Base 
    # Attributes: 
    # - names (string) 
    # - age (integer) 

    # Combine: ["a", "b", "c", ...] => "a,b,c" 
    def names=(values) 
    self[:names] = values.join(",") if values.present? 
    end 
end 

# people_controller.rb 
class PeopleController < ApplicationController 
    def create 
    @record = Record.new(person_params) 
    @record.save! 
    end 

    def person_params 
    params.require(:person).permit(
     # Works fine 
     :age, 
     names: [] 

     # Works fine 
     { names: [] }, 
     :age 

     # Does not work (SyntaxError) 
     names: [], 
     :age 
    ) 
    end 
end 

Вопрос, почему names скалярная массив не работает, когда вы перечисляете его в начале без упаковки его в качестве хэша?

Примеры doc не переносят скалярные массивы с помощью хэша, но они также не являются очень сложными примерами.

Ожидаемое поведение: strong_parameters?

ответ

1

Это не strong_params вещь, а скорее как рубин читает список атрибутов. В Ruby, вы можете только опустить фигурные скобки хэша, когда это последний аргумент для метода, поэтому этот вызов:

any_method(arg1, arg2, key: value, foo: :bar) 

читается как:

any_method(arg1, arg2, { key: value, foo: :bar }) 

Вы не можете пропустить скобки, если хэш не является последним аргументом, хотя, следовательно, это:

any_method(arg1, key: value, arg2) 

поднимет синтаксическую ошибку.

+0

Спасибо за это; Я знал это в какой-то момент, но даже не думал об этом в этом отношении. –