我是Rails的新手,正在尝试学习。我以简单的形式创建了一个下拉选择,其中包含来自称为“职业”的表的生成数据。这部分工作正常,我可以选择多个值。我正在使用mysql数据库。
当我单击提交按钮时,我需要它将选择的值保存到另一个称为用户的表中名为my_professions的列中。我不知道该怎么做。我收到此错误
我的表单
<%= simple_form_for @user, url: wizard_path, method: :put do |f| %>
<%= collection_select(:f, :professions_id, Profession.where.not(name: nil), :id, :name, {:multiple => true}, {:class=>'js-example-basic-multiple', :id=>'jsmultipleddd'}) %>
<%= f.submit "Save", :class => 'btn blue' %>
<% end %>
我已尝试将其添加到用户模型中
user.rb
class User < ApplicationRecord
has_many :professions
accepts_nested_attributes_for :professions
serialize :my_professions, Array
end
以及此为职业模型
profession.rb
class Profession < ApplicationRecord
belongs_to :user
end
我的参数看起来像这样
registration_steps_controller.rb
def user_params
params.require(:user).permit(:gender,:practitioner_website, :public_health_insurance, clinic_images: [], professions: [])
end
application_controller.rb
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:gender, :practitioner_website, :public_health_insurance, clinic_images: [], professions: []])
devise_parameter_sanitizer.permit(:account_update, keys: [:gender, :practitioner_website, :public_health_insurance, clinic_images: [], professions: []])
end
[摆脱accepts_nested_attributes_for :professions
开始。您不需要为此的嵌套属性。
然后摆脱serialize :my_professions, Array
。 Serialize是一种用于在字符串列中存储复杂数据的传统技巧。您永远不需要或不需要这样做,因为关联应该存储在ActiveRecord的联接表中,而不是数组列中。这就是AR被设计为如何工作的方式,关系数据库是如何被设计为工作的方式。
相反,您想要的是联接模型。您可以使用它生成:
rails g model user_profession user:belongs_to profession:belongs_to
运行迁移。然后,您在用户和专业之间设置the associations:
class User < ApplicationRecord
# ...
has_many :user_professions
has_many :professions, through: :user_professions
end
class Profession < ApplicationRecord
# ...
has_many :user_professions
has_many :users, through: :user_professions
end
现在,这使我们可以通过profession_ids
将用户与专业联系起来。
在普通的Rails表单中,您将使用以下命令创建输入:
<%= f.collection_select :profession_ids, Profession.all, :id, :name, multiple: true ... %>
在SimpleForm中,使用the association帮助器:
<%= f.association :professions, ... %>
然后将正确的参数列入白名单:
def user_params
# don't jam this into one super long unreadable line
params.require(:user)
.permit(
:gender, :practitioner_website, :public_health_insurance,
clinic_images: [], profession_ids: []
)
end