如何在rails上的ruby中删除保存在数据库中的“--- \ n-''\ n-”新行空间

时间:2013-06-18 18:34:27

标签: ruby-on-rails ruby database arrays

我正在尝试从下拉列表中为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">格式的下拉列表保存值。但我想像老师学生一样保存它们而不用任何逗号。知道如何在字符串列中保存数组值。

感谢。

4 个答案:

答案 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