У меня есть база данных с кучей пользователей; среди их атрибутов - предпочтения для дней недели, в которые они хотят работать (воскресенье ... суббота, и предпочтения варьируются от никогда / редко / хорошо / предпочтительно). Это хранится в сериализованном хеше user.day_pref.
Отображается нормально, но, похоже, не обновляется из формы при отправке. Учитывая сериализованное хранилище, я не мог получить форму, чтобы справиться с этим.
%h3 Day of week preferences
- weekdays = I18n.t 'date.abbr_day_names'
- if @user.day_pref.nil?
/ - @user.day_pref = Hash.new {|hash, key| hash[key] = "1"}
- @user.day_pref = { "0" => "2", "1" => "2", "2" => "2", "3" => "2", "4" => "2", "5" => "2", "6" => "2" }
- pref_name = ["Almost never", "Avoid", "Okay", "Preferred"]
- pref_color = ["red", "yellow", "green", "violet" ]
= form_for @user, :url => user_path(@user), :method => :put do |f|
%table.table
%th
- for day in (0..6)
%th= weekdays[day]
%tr
%td
- for row in (0..3)
%br
= pref_name[row] + " "
%span{:style => "color:" + pref_color[row]} ♦
- for day in (0..6)
%td
%div
- for row in (0..3)
%br= radio_button_tag "@user.day_pref[" + day.to_s + "]", row.to_s, @user.day_pref[day.to_s] == row.to_s
%tr
%input{:type => "submit", :name => "day-pref-button", :value => "Update day of week preferences"}
В журнале, по-видимому, отображаются данные, отправляемые успешно (и attr_accessible установлен для day_pref), но в базу данных записываются только ранее существующие значения, а не новые, выбранные пользователем:
Started PUT "/user/1" for 127.0.0.1 at 2012-01-02 17:04:35 -0800
Processing by UserController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"/auMOXMVOcO4Yrys2FymMPMxi/g/AI3G67vZPcXCb8M=", "@user.day_pref"=>{"0"=>"1", "1"=>"1", "2"=>"1", "3"=>"1", "4"=>"1", "5"=>"2", "6"=>"2"}, "day-pref-button"=>"Update day of week preferences", "id"=>"1"}
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", "1"]]
(0.4ms) UPDATE "users" SET "updated_at" = '2012-01-03 01:04:35.213534', "day_pref" = '- --
''0'': ''1''
''1'': ''2''
''2'': ''1''
''3'': ''3''
''4'': ''1''
''5'': ''2''
''6'': ''2''
' WHERE "users"."id" = 1
Redirected to http://0.0.0.0:3000/user/1
Completed 302 Found in 61ms
Я знаю, что я делаю здесь какую-то глупую синтаксическую ошибку, возможно, в "radio_button_tag" в коде представления, но в течение последнего месяца я не мог понять это ради своей жизни. Любые указатели оценены.
Я отвечаю на свой вопрос, по крайней мере, частично. Я добавил пару строк к контроллеру, думая, что, возможно, он не переупаковывает мои данные из массива радиокнопок так, чтобы их можно было сохранить.
# PUT /user/1
# PUT /user/1.json
def update
@user = User.find(params[:id])
# The following, when added, stores the radio button data properly
if params["@user.day_pref"]
@user.day_pref = params["@user.day_pref"]
end
respond_to do |format|
if @user.update_attributes(params[:user])
format.html { redirect_to @user, notice: 'User was successfully updated' }
format.json { head :ok }
else
format.html { render action: "edit" }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
Так что теперь это работает, но я не совсем уверен, зачем мне нужна дополнительная строка кода.