如何将所选值从一个表列保存到另一表列

问题描述 投票:0回答:1

我是Rails的新手,正在尝试学习。我以简单的形式创建了一个下拉选择,其中包含来自称为“职业”的表的生成数据。这部分工作正常,我可以选择多个值。我正在使用mysql数据库。

当我单击提交按钮时,我需要它将选择的值保存到另一个称为用户的表中名为my_professions的列中。我不知道该怎么做。我收到此错误

param is missing or the value is empty: user

我的表单

<%= 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
mysql ruby-on-rails database simple-form
1个回答
0
投票

[摆脱accepts_nested_attributes_for :professions开始。您不需要为此的嵌套属性。

然后摆脱serialize :my_professions, ArraySerialize是一种用于在字符串列中存储复杂数据的传统技巧。您永远不需要或不需要这样做,因为关联应该存储在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
© www.soinside.com 2019 - 2024. All rights reserved.