Я пытаюсь написать пользовательский ввод для гема simple_form для модели Rails 3, который имеет составной атрибутome_of.См. Пример ниже.
Я пытался использовать fields_for, но он генерирует такие параметры, как "person"=>{"name"=>{"fname"=>"James","middle"=>"T","lname"=>"Kirk"}
, которые не обрабатываются ни Person.create
, ни update_attributes, как ассоциация.
Выдает следующую ошибку
undefined method `fname' for {"fname"=>"James", "middle"=>"T", "lname"=>"Kirk"}:ActiveSupport::HashWithIndifferentAccess
Как бы вы это реализовали?
Пример
$ rails g scaffold person last_name:string first_name:string middle_name:string
lib / fullname.rb
class Fullname
attr_reader :fname, :middle, :lname
def initialize(fname, middle, lname)
@fname, @middle, @lname = fname, middle, lname
end
end
app / models / person.rb
class Person < ActiveRecord::Base
composed_of :name,
:class_name => 'Fullname',
:mapping =>
[ # database # Fullname
[:first_name, :fname],
[:middle_name, :middle],
[:last_name, :lname]
],
:allow_nil => true
end
app / views / people / _form.html.haml
= simple_form_for @person do |f|
= f.input :name, :as => :fullname
= f.submit 'Save'
app / inputs / fullname_input.rb
class FullnameInput < SimpleForm::Inputs::Base
def input
@builder.simple_fields_for attribute_name, :validate => false do |form|
[ 'First:', form.input_field(:fname, :size => 10),
'Middle:', form.input_field(:middle, :size => 5),
'Last:', form.input_field(:lname, :size => 10)
].join(' ').html_safe
end
end
end