Не могу определить хэш в параметрах, используя field_for и rails 5

Я пытаюсь отправить 2 значения в область рельсов. Мне нужен радиус (представленный тегом диапазона) и почтовый индекс.

У меня есть тег fields_for в форме (в haml):

      =f.fields_for :postcode do |postcode_fields|
        =postcode_fields.text_field(:postcode_d,placeholder: "HQ Location")
        =postcode_fields.range_field(:max_range, in: 1..100)

Сфера:

scope :postcode, lambda {|input|
return nil  if input.blank?

terms = Scotland.near(input[0], input[1])

where(
terms.map { |term|
  " charity_id = ?"
}.join(' OR '),
*terms.map {|e|(e.charity_id)}.flatten
)
}

Контроллер:

    def scotland_params
      params.require(:scotland).permit!(:charity_number, :charity_name, :registered_date, :known_as, :charity_status, postcode: [:postcode_d,:max_range] , :constitutional_form)
    end

Проблема, кажется, в моем определении почтового индекса. Я пробовал разные способы определения хэша почтового индекса, ни один из которых не сработал. Для того, который я использую здесь, ошибка

SyntaxError 

    (/Users/peterkentish/Documents/UNIVERSITY/SecondYear/Semester2/SoftwareHut/project/app/controllers/scotlands_controller.rb:46: syntax error, unexpected =>
..., :charity_status, postcode: =>[:postcode_d, :max_range] , :...
...                               ^
/Users/peterkentish/Documents/UNIVERSITY/SecondYear/Semester2/SoftwareHut/project/app/controllers/scotlands_controller.rb:46: syntax error, unexpected ',', expecting keyword_end
...: =>[:postcode_d, :max_range] , :constitutional_form, :previ...
...                               ^):

TL; DR Как передать вложенные атрибуты в rails 5?

РЕДАКТИРОВАТЬ:

хэш параметров (я думаю):

@scotlands = Scotland.all
@filterrific = initialize_filterrific(Scotland, params[:filterrific]) or return
 @scotlands = @filterrific.find.page(params[:scotlands])
@scotlands = @scotlands.paginate(page: params[:page], per_page: 20)

respond_to do |format|
format.html
format.js

person Peter Kentish    schedule 30.04.2017    source источник


Ответы (3)


Настоящий вопрос заключается в том, почему все сходят с ума, когда дело доходит до написания сильных параметров и втискивания всего определения в одну строку.

Нечитаемый код — это то, как вы получаете ошибки.

def scotland_params
  params.require(:scotland).permit(
    :charity_number, :charity_name, :registered_date, 
    :known_as, :charity_status, :constitutional_form,
    postcode_attributes: [:postcode_d, :max_range]
  )
end
person max    schedule 30.04.2017
comment
Привет спасибо. Я пробовал это и получаю: ActionController::UnpermittedParameters (найден неразрешенный параметр: почтовый индекс): - person Peter Kentish; 01.05.2017
comment
Хм, попробуй как postcode: [:postcode_d, :max_range] вместо postcode_attributes - person max; 01.05.2017
comment
К сожалению, та же проблема, я застрял на этом целую вечность, так что еще раз спасибо. В некоторых местах сказано, что это должно быть :postcode => [:postcode_d, :max_range], но это тоже не работает - person Peter Kentish; 01.05.2017
comment
Можете ли вы добавить хэш params к вопросу? - person max; 01.05.2017
comment
Добавлено, я думаю, это то, что вы имели в виду? - person Peter Kentish; 01.05.2017
comment
Нет — посмотрите логи или вывод в консоли, где вы запускаете rails server — вы должны увидеть хэш входящих параметров. - person max; 01.05.2017
comment
это действительно странно - согласно документам fields_for должно давать postcode_attributes. api.rubyonrails.org/classes/ActionView/Helpers/ - person max; 01.05.2017
comment
Во-первых, вы используете .permit! вместо .permit. .permit! разрешает любые ключи. - person max; 01.05.2017
comment
Я также пробовал .permit. Когда у меня есть это: params.require(:scotland).permit(:charity_number, :charity_name, :registered_date, :known_as, :charity_status , :constitutional_form, postcode_attributes: [:postcode_d, :max_range] , :regulatory_type), я получаю сообщение об ошибке: SyntaxError (/Users/peterkentish/Documents/UNIVERSITY/SecondYear/Semester2/SoftwareHut/project/app/controllers/scotlands_controller.rb:48: syntax error, unexpected ')', expecting =>): @max - person Peter Kentish; 01.05.2017
comment
Вам нужно поставить «postcode_attributes» последним в качестве аргумента ключевого слова, остальные являются позиционными аргументами. - person max; 01.05.2017
comment
Вы можете сделать foo('bar', baz: 'woo'), но не foo(baz: 'woo', 'bar' ) - person max; 01.05.2017
comment
Это прояснило эту ошибку, все еще есть found unpermitted parameter: postcode - person Peter Kentish; 01.05.2017

Я полагаю, вы захотите либо обернуть :postcode => [:postcode_d, :max_range] в {...}, либо переместить :postcode => [:postcode_d, :max_range] в конец списка аргументов permit!.

SyntaxError - это Ruby, при интерпретации вашего кода ничего не ожидая после хэша :postcode, поскольку нет явных {...}.

person openbl    schedule 01.05.2017

Если кто-то столкнется с этим, в фильтре драгоценных камней есть ошибка:

https://github.com/jhund/filterrific/pull/116

Спасибо тем, кто помог

person Peter Kentish    schedule 01.05.2017