Rails не хочет хранить измененные атрибуты вложенного объекта. Я использую:
- Рельсы 4
- PostgreSQL 9.3
- Столбец Hstore в Postgresql
- Вложенные атрибуты в представлениях
- Использование с драгоценным камнем
Здесь таблица базы данных:
create_table :accounts_roles do |t|
t.references :account, null: false
t.references :role, null: false
t.hstore :configurations
t.timestamps
end
Здесь модели:
class Account < ActiveRecord::Base
has_many :accounts_roles
has_many :roles, through: :accounts_roles
accepts_nested_attributes_for :accounts_roles
end
class AccountsRole < ActiveRecord::Base
belongs_to :account
belongs_to :role
store_accessor :configurations, :color
end
Контроллер разрешает все атрибуты для отладки:
def account_params
params.require(:account).permit!
end
На мой взгляд, я использую fields_for:
<%= form_for @account ... %>
...
<%= f.fields_for :accounts_roles do |ar| %>
<%= ar.text_field :color ... %>
Если я отправлю форму редактирования, хэш параметра выглядит нормально:
{"utf8"=>"✓", "account"=>{..., "accounts_roles_attributes"=>{"0"=>{"color"=>"green", "id"=>"5"}}},...}
Но цвет не меняется на "зеленый", он остается "красным"!
В консоли rails я попытался выполнить тот же процесс вручную:
> u = Account.first
> u.account_roles.first.color
=> "red"
> u.update(accounts_roles_attributes: { color: "green", id: 5 } )
=> true
> u.account_roles.first.color
=> "green"
> u.save
=> true
> u = Account.first
> u.account_roles.first.color
=> "red"
Но безуспешно. Цвет атрибута остается красным. Есть идеи?
accounts_roles
! Типа, рельсы не видят, что представленный атрибут не такой, как в базе данных. - person phlegx   schedule 14.02.2015u.account_roles.first.color
, вы не попадаете в базу данных - вы получаете свойство объекта, который вы только что установили. - person mmln   schedule 14.02.2015u.save
в этом примере (см. пример с консолью) я перезагружаю объект с помощьюu = Account.first
, чтобы проверить, есть ли в базе данных обновление. Если я сделаю:ar = u.account_roles.first
, а затемar.color = 'green'
иar.save
, то я увижу переход обновления SQL. Это работает. Таким образом, это не проблема проверки. Потому что это работает таким образом. Но почему не работает в представлении с вложенными атрибутами? - person phlegx   schedule 14.02.2015t.references :role, null: false
говорит базе данных не принимать нулевые значения, может быть, вы уже получили недопустимую запись в своей базе данных (отсутствует :role_id)? Вы пытаетесь обновить цвет недопустимой записи (и вы также не передаете :role_id в своем запросе), поэтому в базе данных ничего не сохраняется? - person mmln   schedule 14.02.2015