Rails:更改用户首选项表单

时间:2011-12-09 17:58:13

标签: ruby-on-rails ruby ruby-on-rails-3 forms model-view-controller

我有一个has_one :preference的用户模型,但我想加入表单来更新用户和表单以更新他的偏好,所以在用户的​​表单中,我添加了:

<% if !@user.new_record? %>
  <div class="field">
    <%= label_tag 'user_preference_quote_type', 'Type de citations' %><br />
    <%= text_field_tag 'user_preference_quote_type', @user.preference.quote_type %>
  </div>
  <div class="field">
    <%= label_tag 'user_preference_locale', 'Langage' %><br />
    <%= text_field_tag 'user_preference_locale', @user.preference.locale %>
  </div>
<% end %>

在我的控制器中:

  def update
    @user = User.find(params[:id])
    @user.preference.quote_type = params[:user_preference_quote_type]
    @user.preference.locale = params[:user_preference_locale]

    respond_to do |format|
      if @user.update_attributes(params[:user])
        format.html { redirect_to(@user, :notice => t('c.users.update')) }
        format.xml  { head :ok }
      else
        format.html { render :action => "edit" }
        format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
      end
    end
  end

但是偏好不会改变,我该怎么办呢?还有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

这不是一个很好的方法。您应该使用fields_for。它会使你的表格更清洁。顺便说一句,你在控制器中所做的事情是行不通的,因为你使用update_attributes来更新你的模型,使你的分配无用。使用上面提到的fields_for也可以帮助您清理控制器。但要小心,因为你的模型肯定需要accepts_nested_attributes_for

答案 1 :(得分:0)

检查嵌套属性:{{3p>