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
这是定义表单的正确方法吗,如果我需要提供更多详细信息,请告诉我。
这是 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