2015-07-21 3 views
0

Я пытаюсь разрешить массив с произвольным количеством значений, но Rails бросает Unpermitted parameter: service_rates каждый раз. Я много пробовал (Rails 4 Unpermitted Parameters for Array, Unpermitted parameters for Dynamic Forms in Rails 4, ...), но ничего не работает.Параметр unpermitted для массива с динамическими ключами

Имя поля service_rates и его тип столбца jsonb.

Я хочу, чтобы создать объект JSON из произвольного числа полей ввода:

<%= f.hidden_field :service_ids, value: @services.map(&:id) %> 
<% @services.each do |service| %> 
    <tr> 
    <td> 
     <% value = @project.service_rates ? @project.service_rates["#{service.id}"]['value'] : '' %> 
     <%= text_field_tag "project[service_rates][#{service.id}]", value, class: 'uk-width-1-1', placeholder: 'Stundensatz' %> 
    </td> 
    </tr> 
<% end %> 

Так мои данные POST выглядит следующим образом:

project[service_rates][1] = 100 
project[service_rates][2] = 95 
project[service_rates][3] = 75 

В настоящее время service_rates разрешается через белый список с tap:

def project_params 
    params.require(:project).permit(:field1, :field2, […], :service_ids).tap do |whitelisted| 
    whitelisted[:service_rates] = params[:project][:service_rates] 
    end 
end 

В le аст, я строю объект JSON в частной функции модели (которая выдает эту ошибку):

class Project < ActiveRecord::Base 
    before_save :assign_accounting_content 

    attr_accessor :service_ids 

    private 

    def assign_accounting_content 

    if self.rate_type == 'per_service' 
     service_rates = {} 
     self.service_ids.split(' ').each do |id| 
     service_rates["#{id}"] = { 
      'value': self.service_rates["#{id}"] 
     } 
     end 

     self.service_rates = service_rates 
    end 

    end 

end 

Я также попытался разрешить поле, как ...

params.require(:project).permit(:field1, :field2, […], :service_rates => []) 

... и что ...

params.require(:project).permit(:field1, :field2, […], { :service_rates => [] }) 

... но это также не работает.

Когда я попробовать это ...

params.require(:project).permit(:field1, :field2, […], { :service_rates => [:id] }) 

... Я получаю это: Unpermitted parameters: 1, 3, 2

+1

смог сбросить свой объект запроса (как это выглядит, прежде чем это Вы перешли к сильным параметрам?) Я столкнулся с этим в последнее время. –

ответ

1

Это не совсем ясно, что service_rates для вас. Это имя ассоциации? Или просто массив строк?

Чтобы массив строк: :array => [], Чтобы разрешить вложенные Params для объединения: association_attributes: [:id, :_destroy, ...]

params.require(:object).permit(
    :something, 
    :something_else, 
    .... 
    # For an array (of strings) : like this (AFTER every other "normal" fields) 
    :service_rates => [], 
    # For nested params : After standard fields + array fields 
    service_rates_attributes: [ 
    :id, 
    ... 
    ] 
) 

Как я объяснил в комментариях, по вопросам заказа. Ваш белый список массив должен появляться после каждого классических полей

EDIT

форма должна использовать f.fields_for для вложенных атрибутов

<%= form_for @project do |f| %> 
    <%= f.fields_for :service_rates do |sr| %> 
     <tr> 
     <td> 
      <%= sr.text_field(:value, class: 'uk-width-1-1', placeholder: 'Stundensatz' %> 
     </td> 
     </tr> 
    <% end %> 
<% end %> 
+0

Спасибо, ты указал мне в правильном направлении. 'service_rates' - объект (объектов), а не массив. Можно ли разрешить хэш с произвольными (вложенными) ключами и значениями? – Slevin

+0

Ну, принимая произвольное количество ключей и значений, это противоположность сильным параметрам Rails 4. Это небезопасно. Но вы все равно можете получить доступ к параметрам с помощью параметра 'params [service_rates]' –

+0

Можно ли разрешить ключи динамически? Содержимое 'service_rates' выглядит как' 1 ': {' value ': 10,' active ': true},' 2 ': {' value ': 20,' active ': false} '.Клавиши ('1',' 2', ...) являются идентификаторами записей из моей модели «Сервис». Будет ли это работать: 'allow ({: service_rates => {HOW_TO_ADD_ALL_SERVICE_IDS_HERE?}})'? – Slevin

Смежные вопросы