如何使用collection_select helper保存值和文本?

时间:2017-12-15 21:40:47

标签: ruby-on-rails

用户表格中,有一个地方可以找到' country_id'和国家/地区代表的国家/地区名称'领域(冗余是有意识的决定)

我的问题是: '国'字段是空的。我必须以错误的方式使用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

2 个答案:

答案 0 :(得分:0)

我认为,您应该使用'options_from_collection_for_select'代替

这比在这个例子中的#select_tag中使用的更频繁:

select_tag 'person', options_from_collection_for_select(@people, 'id', 'name')

答案 1 :(得分:0)

不是网络浏览器的工作方式。浏览器仅发送标记的value属性和父选择的name属性。这被Rack反序列化为哈希值。

虽然您可以将ID和名称一起作为其首先不需要的值加入。那&#34;冗余&#34;真的只是重复,这是一个更大的问题。如果更改了国家/地区的名称,则您将获得包含错误数据的用户记录。您必须设置一个昂贵的更新回调或触发器来避免这种情况。

如果国家/地区很重要,您需要通过在数据库中设置约束并在应用程序中进行验证来强制执行。

您希望确保users.country_id列不可为空并且具有外键约束以强制引用完整性。

在应用程序端,Rails 5中的belongs_to关联宏默认为optional: false,因此您不需要设置任何内容。