我正在开发一个Rails应用程序,我有一组两个单选按钮,用户可以单击“是”或“否”。 ActiveRecord迁移创建的MySQL DB列是一个tinyint。
如果用户没有单击任一单选按钮,我希望MySQL存储NULL
。 (该列允许NULL。)当他们返回编辑数据时,两个按钮都不应该被检查。
发生的事情是ActiveRecord正在存储0
,然后当我回来时,选中“否”按钮。
Rails 2.3.5
表格代码(我使用的是Haml):
= f.radio_button( :model_attribute, true )
Yes
= f.radio_button( :model_attribute, false )
No
(回想起来,使用一个复选框可能会更好,但现在很难改变它。)
答案 0 :(得分:3)
我遇到了ASP.NET MVC这样的问题。由于null
本质上是第三种可能状态,因此我添加了默认选择的第三个隐藏单选按钮。当我的回复包含“null”单选按钮响应时,我手动设置它。我不确定这是不是你想要的,但它对我的情况非常有效。
答案 1 :(得分:2)
这似乎打败了单选按钮的想法(即,从一组中选择一个)。如果跟踪“无响应”很重要,那么是否可以为此选项添加第三个单选按钮?如果您不希望用户选择响应,然后重新选择“无响应”,则可以选择性地选择根据表单上的当前值显示该表单。
答案 2 :(得分:2)
这是我的看法。我希望用户能够取消选择true / false并将属性设置为nil(Rails 4):
形式
= f.radio_button :accepted, true
= f.radio_button :accepted, false
= f.radio_button :accepted, 'nil'
控制器
def widget_params
if params[:widget][:accepted] == 'nil'
params[:widget][:accepted] = nil
end
params.require(:widget).permit(:accepted)
end
答案 3 :(得分:1)
如何将:default => null
添加到列的ActiveRecord迁移中?
答案 4 :(得分:1)
我自己检查了它,它只是按你的意愿工作。您确定更新操作或模型中没有更改属性的代码吗?如果表单中没有选择无线电,则params散列将没有该属性的值,并且记录将保留其先前的值。检查您的属性编写器方法或回调方法的模型。
答案 5 :(得分:1)
从您对我的评论的回应来看,这似乎是您想要的行为,所以这似乎不是UI问题,而是您的模型的问题。在我看来,调用YourModel.create()会在列中创建一个0的DB条目。
可能你可以通过在构造函数中将模型属性默认为nil来解决这个问题,因为看起来ActiveRecord会将它默认为false。
class YourModel
def initialize
self.model_attribute = nil
end
end
但是,如果你真的想要3个选项是,不是或不设置那么你应该只是将model_attribute从布尔值更改为“枚举”,其中0表示“未设置”,1表示“是”,2表示“否” ”
答案 6 :(得分:1)
我今天在以下(简化)示例中解决了这个问题。它并不完美,但它似乎对我有用:)必须有一种更简单的方法来规避Rails没有通过参数发送没有选择值的单选按钮......
在控制器中:
def create
params[:post] = Post.deselect_radio_buttons(params[:post])
@post = Post.new(params[:post])
if @post.save
redirect_to post_path(@post), notice: 'Post created'
else
render action: :new
end
end
在模型中:
# Define the fields that are used as radio buttons in the form.
RADIO_BUTTONS = [:field1, :field2]
def self.deselect_radio_buttons(params)
RADIO_BUTTONS.each do |field|
if params[field].blank?
params[field] = nil
end
end
return params
end