我正在尝试从下拉列表中为db中的用户(如学生,教师)保存多个角色。我正在使用“选择”控件<%= f.select :role,["Teacher","Student"],{},{:multiple => true ,:required => true} %>
在db中保存多个值。目前,我可以从下拉列表中选择多个值,并以下列格式"---\n- ''\n- Teacher\n- Student\n">
保存在数据库中。但我只想保存[师生]。我不知道,如何删除“--- \ n - ”。我尝试使用chomp,检查方法但没有运气。
一件事,“选择控件接受数组中的输入值,但我在用户表中的角色列是字符串类型。
_form.html.erb
<div>*<%= f.label :role %><br />
<%= f.select :role,["Teacher","Student"],{},{:multiple => true ,:required => true} %>
</div>
schema.rb
create_table "users", :force => true do |t|
t.string "email", :default => "", :null => false
t.string "encrypted_password", :default => "", :null => false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer "sign_in_count", :default => 0
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.string "current_sign_in_ip"
t.string "last_sign_in_ip"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
t.boolean "is_admin"
t.string "username"
t.string "first_name"
t.string "last_name"
t.string "contact_no"
t.date "birth_date"
t.boolean "is_active"
t.date "joining_date"
t.string "avatar_url"
t.boolean "is_hr"
t.boolean "is_manager"
t.string "designation"
t.string "user_code"
t.string "user_role"
t.string "role"
end
角色保存在db
中 role: "---\n- ''\n- Teacher\n- Student\n">
目前,我可以通过"---\n- ''\n- Teacher\n- Student\n">
格式的下拉列表保存值。但我想像老师学生一样保存它们而不用任何逗号。知道如何在字符串列中保存数组值。
感谢。
答案 0 :(得分:2)
我在@ joe-half-face解决方案和google serarch的帮助下得到了解决方案。以下是针对上述问题的工作解决方案。
首先我尝试了
serialize :role, Array
before_save :make_array
def make_array
self.role=self.role.split(" ")
end
它给了我一半的解决方案,如** [[["", "Teacher", "Student", "Author"]]]**
。解决方案的问题是它给了我额外的方括号和第一个数组值为nil,即使我没有选择第一个值。
serialize:role,Array给出类似["", "Teacher", "Student", "Author"]
的输出但仍然是第一个数组值为nil。我通过在用户模型中放入以下代码来解决这个问题。
<强>溶液强>
serialize :role
before_save :make_array
def make_array
self.role.reject!(&:blank?) if self.role
end
所有这些代码都转到了用户模型。
答案 1 :(得分:1)
已更新
当select中的值变为模型时,它们会调用to_s方法。结果就是你在dabatase中看到的结果。如果你想以不同的格式保存值,你可以使用PosgtreSQL数组列(我认为你需要使用rails 4)或者在过滤之前将它们序列化为
serialize :role, Array
获取逗号分隔值(以及任何可能的空格)
答案 2 :(得分:1)
您无法在数据库列中保存数组(不计算hstore之类的内容)
在这些情况下,哪些rails使用YAML将数组序列化为字符串。这就是“---”的来源:它是YAML格式的一部分。
如果您想在该列中存储其他内容,则由您来操作在到达模型之前传递给控制器的参数。
答案 3 :(得分:1)
serialize :role, Array
before_save :make_array
def make_array
self.role=self.role.split(" ")
end