在用户表中,有'country_id'的地方,国家名称由'country'字段表示(冗余是有意识的决定)
我的问题是:'country'字段是空的。我必须以错误的方式使用collection_select助手吗?怎么解决?
这是我的表格:
<%= form_for :user, url: users_path do |f| %>
<%= f.collection_select(:country_id, Country.all, :id, :country_name ) %>
...
这是我的创建动作:
def create
@user = User.new(user_params)
@user.save
redirect_to @user
end
private
def user_params
params.require(:user).permit(:country_id, :country ... )
end
end
这不是网络浏览器的工作方式。浏览器仅发送标记的value属性和父选择的name属性。这被Rack反序列化为哈希。
虽然您可以将id和名称加在一起作为首先不需要的值。 “冗余”实际上只是重复,这是一个更大的问题。如果更改了国家/地区的名称,则您将获得包含错误数据的用户记录。您必须设置昂贵的更新回调或触发器以避免这种情况。
如果拥有一个国家/地区很重要,则需要通过在数据库中设置约束并在应用程序中进行验证来强制执行。
您希望确保users.country_id
列不可为空并且具有外键约束以强制引用完整性。
在应用程序端,Rails 5中的belongs_to
关联宏默认为optional: false
,因此您不需要设置任何内容。
我想,您应该使用'options_from_collection_for_select'代替
这比在这个示例中的#select_tag中使用更频繁:
select_tag 'person', options_from_collection_for_select(@people, 'id', 'name')