我在用simple_form构建的RoR应用程序中有一个输入表单。
其中一个输入字段是帖子的类别,实现为单选按钮的集合。保存输入时,此字段为空且不保存。我找不到原因。
我的表格:
<%= simple_form_for @post do |form| %>
<%= form.collection_radio_buttons(:category_id, Category.all, :id, :name %>
<% end %>
我的型号:
def new
@post= Post.new
@categories = Category.all.map{|c| [ c.name, c.id ] }
end
def create
@post = Post.new(params.require(:post).permit(:title, :description))
@post.category_id = params[:category_id]
@categories = Category.all.map{|c| [ c.name, c.id ] }
...
...
end
奇怪的是,如果我用一个可选择的下拉列表来做,一切都可以:
<%= simple_form_for @post do |form| %>
<%= select_tag(:category_id, options_for_select(@categories, selected: @post.category_id)) %>
<% end %>
我做错了什么?
我很确定,在第一个示例(单选按钮)中,您将参数提交为:
params = {
post: {
category_id: 1
}
}
而在第二个例子中(选择),您将参数提交为:
params = {
category_id: 1
}
这是因为您的第一个示例在表单对象(即form.collection_radio_buttons
)之外创建了单选标记,而第二个示例在其自身(即与form.select_tag
相反的select_tag
)上创建了选择标记
我建议按如下方式更新您的创建操作,并将您的form.collection_radio_buttons保持原样:
def create
@post = Post.new(params.require(:post).permit(:title, :description, :category_id))
# @post.category_id = params[:category_id] # remove this line
...
end
这基本上导致了一个更简单、更传统的表单/控制器设置,你可以在互联网上的例子中看到。