Ожидаемый Hash (получил массив) для параметра 'samples'

Я следил за эпизодами Railscasts Вложенных форм и сложных форм. За время создания нескольких моделей в одной форме я смог редактировать, обновлять, удалять и создавать записи для образцов моделей, которые были вложены в пакетную модель.

Я долго ломал голову и пытался искать, но не мог найти правильного решения для этой проблемы.

мой файл журнала разработки дает мне следующую ошибку.

СООБЩЕНИЕ ОБ ОШИБКЕ:

Status: 500 Internal Server Error
  expected Hash (got Array) for param `samples'

в моем контроллере у меня есть действие обновления, как это

def update
     @batch = Batch.find(params[:id])

     respond_to do |format|
       if @batch.update_attributes(params[:batch])
         flash[:notice] = 'Successfully updated Batch.'
         format.html { redirect_to(@batch) }
         format.xml  { head :ok }
       else
         format.html { render :action => "edit" }
         format.xml  { render :xml => @batch.errors, :status => :unprocessable_entity }
       end
     end
   end

мой взгляд примерно такой:

<%= form_for @batch do |f| %>
......
<%= f.fields_for :samples do |s_form| %>
.... s_form things
<% end %>
<% end %>

моя модель содержит те же вещи:

has_many :samples, :dependent => :destroy

  accepts_nested_attributes_for :samples, :reject_if => lambda { |a| a[:content].blank? }, :allow_destroy => true

Все предложения приветствуются.

4 ответа

Для других, кто столкнулся с той же проблемой:

эта ошибка возникает, когда в вашей форме есть два поля, например:

video: 'some string'
video['url']:  'some url'

тогда рельсы потерпят крах с ошибкой: ожидаемый Hash (получил String) для параметра

Решение довольно простое: замените "видео" на что-то другое. например:

video_origin_url: 'some string'
video['url']: 'some url'

У меня была такая же проблема, и я просто исправил ее.

Проверьте заголовки вашего запроса. Я мой, я видел:

weight[2][name]:Tests
weight[2][value]:75
weight[1][name]:Quizzes
weight[1][value]:25
weight[][name]:Foo
weight[][value]:

Это были последние два, которые вызвали проблему. В моем случае я должен был дать этому весу ID, чтобы избавиться от ошибки.

У меня была эта проблема, когда пользователь сам ввел параметры в запросе, например:

https://example.com/page?samples[]=1&samples[test]=2

Отлаживая код, я перешел кRack::QueryParser.parse_nested_queryметод вrackдрагоценный камень:

      # parse_nested_query expands a query string into structural types. Supported
# types are Arrays, Hashes and basic value types. It is possible to supply
# query strings with parameters of conflicting types, in this case a
# ParameterTypeError is raised. Users are encouraged to return a 400 in this
# case.
def parse_nested_query(qs, d = nil)
  params = make_params

  unless qs.nil? || qs.empty?
    (qs || '').split(d ? (COMMON_SEP[d] || /[#{d}] */n) : DEFAULT_SEP).each do |p|
      k, v = p.split('=', 2).map! { |s| unescape(s) }

      normalize_params(params, k, v, param_depth_limit)
    end
  end

  return params.to_h
rescue ArgumentError => e
  raise InvalidParameterError, e.message, e.backtrace
end

Из строки документации:

Строки запроса можно снабдить параметрами конфликтующих типов, в этом случаеParameterTypeErrorПоднялся. В этом случае пользователям рекомендуется возвращать 400 .

Здесь я нашел несколько решений. Rails ActionController::BadRequest вызывает ошибку сервера 500 на рабочем сервере.

Я тоже получил эту ошибку Invalid request parameters: expected Hash (got Array) for param 'cell'.

В моем случае я исказил имя поля, например

f.text_field :name, name: 'cell[name][]'

это вызывало ошибку. Теперь я сделал следующее, и ошибка исчезла:-

f.text_field :name, name: 'cell[][name]'

в этом решении я фактически пытался получить данные в формате массива.

Другие вопросы по тегам