Rails 表单未更新属性

Rails Form Not Updating the Attributes

这是定义表单的正确方法吗,如果我需要提供更多详细信息,请告诉我。

这是 new.html.erb

中的 UserPreference 表单
<%= form_for :user_preference, url: user_preferences_path do |u|%>
     <p>
        <%= u.label :title %><br>
        <%= u.text_field :title %>
      </p>

      <p>
        <%= u.label :description %><br>
        <%= u.text_field :description %>
      </p>

      <p> <%= u.label :back_ground_color %><br>
        <select name="bgcolor" id="bgcolor">
            <option value="#FF3300">Orange</option>
            <option value="#00FF00">Green</option>
            <option value="#0000FF">Blue</option>
            <option value="#FF0066">Pink</option>
            <option value="#FFFF00">Yellow</option>
            <option value="#FFFFFF">White</option>
        </select>
      </p>

      <p>
        <%= u.label :font %><br>
        <select name="font" id="font">
            <option value="Times New Roman">Times new Roman</option>
            <option value="Verdana">Verdana</option>
            <option value="Arial">Arial</option>
            <option value="sans-serif">serif</option>
        </select>
      </p>

     <br >
      <p>
        <%= u.submit %>
      </p>

当我尝试在 html 中呈现时,我得到了标题和描述, 该属性未在数据库中更新。

UserPreference.controller.rb

class UserPreferencesController < ApplicationController
    def new
        @user_preference = UserPreference.new
    end

    def create
        @user_preference = UserPreference.new(userp_params)
        @user_preference.save unless user_signed_in?
        render plain: params[:user_preference].inspect
    end
    def edit
    end
    def update
    end

    private
    def userp_params
        params.require(:user_preference).permit(:title, :bgcolor, :font, :description)
    end
end

当你这么说的时候

<%= u.text_field :description %>

因为您正在使用 :user_preference,它会生成类似

的输入
<input type="text" name="user_preference[description]" value="foo">

(其中 'foo' 是当前值,也可能是空白)

注意 "name" 属性:这将进入

之类的参数
params = {:user_preference => {:description => "foo"}}

如果您要手动编码 select 那么您需要确保 name 属性也具有这种结构,例如

 <select name="user_preference[bgcolor]" id="bgcolor">

所以你会得到像

这样的参数
params = {:user_preference => {:description => "foo", :bgcolor => "#FFFFFF"}}

然后你可以说

@user_preference.attributes = params[:user_preference]

这是在控制器中处理此问题的标准方法。

但是,与其为 select 写出所有 html,不如使用 rails 表单助手(在本例中为 select),例如你用文本字段做。您还可以使用 options_for_select 帮助程序定义 select 的选项,这也节省了很多输入。

 <%= u.select :bgcolor, options_for_select([["Orange", "#FF3300"], ["Green", "#00FF00"], ["Blue", "#0000FF"], ["Pink", "#FF0066"], ["Yellow", "#FFFF00"], ["White", "#FFFFFF"]]) %>

在代码中的某处定义此选项变量也更清晰,例如在 UserPreference class 方法中:

class UserPreference < ActiveRecord::Base

  #class methods section
  class << self

    def bgcolor_options
      [["Orange", "#FF3300"], ["Green", "#00FF00"], ["Blue", "#0000FF"], ["Pink", "#FF0066"], ["Yellow", "#FFFF00"], ["White", "#FFFFFF"]]
    end
  end
end

现在您可以像这样使用 select:

 <%= u.select :bgcolor, options_for_select(UserPreference.bgcolor_options) %>

http://guides.rubyonrails.org/form_helpers.html#the-select-and-option-tags