Надеюсь, это поможет.

я есть следующий код в моей форме.

<%= f.datetime_select(:date_time, :prompt => {:day => 'Day', :month => 'Month', :year => 'Year'}, :start_year => Date.today.year, :end_year => Date.today.year + 2, :minute_step => 15, :include_blank => false) %> if either one is blank.

Когда одно из полей остается пустым,Я получил:

1 error(s) on assignment of multiparameter attributes

Передаваемые параметры:

{"utf8"=>"✓",
 "authenticity_token"=>"kQpfsj5RxnDtxkvBdwPEFnX1fY6euKnMQeDRAkvJvIE=",
 "event"=>{"description"=>"",
 "venue"=>"",
 "street"=>"",
 "city"=>"",
 "country_id"=>"",
 "date_time(1i)"=>"",
 "date_time(2i)"=>"",
 "date_time(3i)"=>"",
 "date_time(4i)"=>"00",
 "date_time(5i)"=>"00",
 "ticket_url"=>""},
 "x"=>"94",
 "y"=>"12"}

Кто-нибудь знает, почему это происходит?

Кажется, в этом есть "грязное" исправлениессылка, но, возможно, есть лучшее решение в Rails 3?

 tybro010331 дек. 2011 г., 00:51
Является ли ваше поле date_time виртуальным (нет фактического столбца БД)? Если так, то ответ Габеодесс - это то, что вы ищете.

Ответы на вопрос(6)

который не был поддержан атрибутом базы данных. Я написал небольшое промежуточное ПО Rack для решения этой проблемы:

class DateParamsParser
  def initialize(app)
    @app = app
  end

  def call(env)
    if %w{POST PUT}.include? env['REQUEST_METHOD']
      params = Rack::Utils.parse_query(env["rack.input"].read, "&")

      # selects only relevant params like 'date1(1i)'
      filtered_params = params.select{ |key, value| key =~ /\(\di\)/ }
      # delete date params
      filtered_params.each { |key, value| params.delete(key) }

      # returns something like {'date1' => [2012, 5, 14], 'date2' => [2002, 3, 28]}
      date_array_params = filtered_params.sort.reduce({}) do |array_params, keyvalue|
        date_key = keyvalue.first.match(/(.+)\(/)[1] + ']'
        array_params[date_key] ||= []
        array_params[date_key] << keyvalue.last
        array_params
      end

      # Creates params with date strings like {'date1' => '2012-5-14', 'date2' => '2002-3-28'}
      date_params = Hash[date_array_params.map{ |key, date_array| [key, date_array.join('-')] }]

      params.merge! date_params
      env["rack.input"] = StringIO.new(Rack::Utils.build_query(params))
      env["rack.input"].rewind
    end

    @app.call(env)
  end
end

И в application.rb ставлю

config.middleware.insert_before ActionDispatch::ParamsParser, "DateParamsParser"

Обратите внимание, что я строю только строку даты здесь. Так что, если вам также требуется время, вам нужно построитьdate_params иначе.

Удалить:include_blank => false из вашего кода.

<%= f.datetime_select(:date_time, :prompt => {:day => 'Day', :month => 'Month', :year => 'Year'}, :start_year => Date.today.year, :end_year => Date.today.year + 2, :minute_step => 15 %>

Спасибо....

 Christian Fazzini18 янв. 2011 г., 08:48
Все еще получаю ту же ошибку. Теперь у меня есть: <% = f.datetime_select (: date_time,: prompt => {: day => 'Day',: month => 'Month',: year => 'Year'},: start_year => Date. today.year,: end_year => Date.today.year + 2,: minute_step => 15)%>

Я столкнулся с той же проблемой с моделью ниже

class Reservation < ActiveRecord::Base
    attr_accessor :sid, :check_in, :credit_card_number, :expiration_date
    attr_accessible :expiration_date
end

Соответствующая форма с полем для срока годности:

<div class="field">
  <%= f.label :expiration_date %>
  <%= f.date_select(:expiration_date, start_year: Time.now.year + 3, :end_year => Time.now.year - 3, discard_day: true) %>
</div>

как уже упоминалось @gabeodess, проблема заключается в проверке базы данных на предмет вывода типа в соответствии с решением, которое я сделал для этого, добавив следующий код в модель, чтобы в этом случае указать тип необходимого атрибута: expiration_date, чтобы модель была изменена, чтобы последующий

class Reservation < ActiveRecord::Base
  attr_accessor :sid, :check_in, :credit_card_number, :expiration_date
  attr_accessible :expiration_date
  columns_hash["expiration_date"] = ActiveRecord::ConnectionAdapters::Column.new("expiration_date", nil, "date")
end

Надеюсь, это полезно

 rnaud09 июл. 2014 г., 22:56
ActiveRecord :: ConnectionAdapters :: Column.new работает, но убивает способность делать db: schema: load for me

Что означает ActiveRecord :: MultiparameterAssignmentErrors?

  date_hack(attributes, "deliver_date")
  super(attributes)
end   

def date_hack(attributes, property)
  keys, values = [], []
  attributes.each_key {|k| keys << k if k =~ /#{property}/ }.sort
  keys.each { |k| values << attributes[k]; attributes.delete(k); }
  attributes[property] = values.join("-")
end

attr_accessible для этого атрибута, и он отлично работает.

Надеюсь, это поможет.

Решение Вопроса

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

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

Я обнаружил, что хочу установитьattr_accessor обрабатывать передачу даты моей модели вform_for пометить сf.datetime_select помощник. Итак, вот что у меня было:

Модель:

attr_accessor :my_time

Посмотреть:

<%= f.datetime_select :my_time %>

К сожалению, когда я отправляю свою форму, я получаю это:

1 error(s) on assignment of multiparameter attributes

Что ж, получается, что это на самом деле ошибка Rails, билет на которую был отправлен. В то же время, как мы делаем эту работу? Единственное решение, которое я мог найти, которое было отдаленно привлекательным, - это использоватьcomposed_of в качестве заменыattr_accessor, так...

Модель:

  composed_of :my_time,
              :class_name => 'Time',
              :mapping => %w(Time to_s),
              :constructor => Proc.new{ |item| item },
              :converter => Proc.new{ |item| item }

Я почти ничего не знаю оcomposed_of метод, так что вы, вероятно, должны самостоятельно читать его, но я знаю, что он создает и читателя, и записывающего для данной переменной экземпляра, и, что более важно, установщик принимает многопараметрические атрибуты. Как я выбрал варианты:

имя_класса: имя нашего ожидаемого класса. В этом случае,Time
Отображение: первый аргумент является классом, а второй аргумент, похоже, работает с любым методом, на который отвечает экземпляр класса. я выбралto_s Конструктор: Не совсем уверен, как это должно работать. Кажется, будет вызван, когда@my_time являетсяnil.
Конвертер: Не совсем уверен, как это должно работать. Кажется, вызывается когда из my_time =, но, кажется, не применяется с массовым назначением. Одна из проблем, с которой я столкнулся при использовании этого решения, заключалась в том, что время устанавливалось в UTC, а не в часовом поясе среды. Так что, к сожалению, мы не можем использовать my_time напрямую, но вместо этого нужно преобразовать его в соответствующий часовой пояс:

Time.zone.parse(my_time.to_s(:number))
 kayluhb01 февр. 2013 г., 18:59
Также понизили из-за автономного решения.
 tybro010331 дек. 2011 г., 00:48
Yippie! Вы только что спасли меня целый день :) Отличный хак
 Gunchars17 мар. 2013 г., 02:33
Оригинальное решение по ссылке здесь:web.archive.org/web/20120121005808/http://gabeodess.heroku.com/...
 Caleb Thompson23 мар. 2012 г., 15:39
Это все еще кажется проблемой, @gabeodess. Вы случайно не знаете номер билета в Rails для этой проблемы?
 iblue21 янв. 2013 г., 10:43
Понижено, потому что ссылка с решением находится в автономном режиме.

Ваш ответ на вопрос