Обновление базы данных рельсов с помощью сериализованного массива из переключателей - PullRequest
1 голос
/ 03 января 2012

У меня есть база данных с кучей пользователей; среди их атрибутов - предпочтения для дней недели, в которые они хотят работать (воскресенье ... суббота, и предпочтения варьируются от никогда / редко / хорошо / предпочтительно). Это хранится в сериализованном хеше 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...