2013-08-05 128 views
0

我的数据库中有一个文本字段,称为要存储部门列表的部门。用户将用逗号分隔输入部门的名称。例如:从文本字段获取值并将其存储为数组

department1, deaprtment2, department3 

我希望在用户提交表单时将此值存储为数组。另外,我希望将部门列表显示为下拉列表。最后,在更新表格时,部门字段也应该像以前一样可编辑(通过输入以逗号分隔的文本进行更新)。

编辑: 我已经加入这个我的模型:

class Org < ActiveRecord::Base 
    serialize :department, Array 
    attr_accessible :name, :department 
    before_validation :update_department 
    validates :name, presence: true 
    def update_department 
    if department_changed? and department.is_a?(String) 
     self.department = self.department.split(',').collect(&:strip) 
    end 
    end 
end 

和视图:

<%= f.text_area :department, :cols => "10", :rows => "10" %> 

现在每当我尝试注册时,该部门领域已经有[]目前,当我尝试更新部门已经[“[部门1”,“部门2]”]。

我想在注册时删除[],并且只有department1,department2在更新时显示。

请帮忙。

+1

您应该'连载:部门,Array'(http://stackoverflow.com/questions/4711334/string-to-serialized-array) – MrYoshiji

+0

@MrYoshiji:我已经编辑我的问题。你能否提供一些进一步的解决方案? – sushilthe

回答

1

做到这一点的最好方法是通过您的模型。我假设你有一个叫Org的模型,另一个叫Department,而你定义的这两个模型有很多关系。然后,所有你需要做的就是在你的组织模型中添加以下代码:

def department_list 
    departments.collect { |d| d.department_name }.join(', ') 
    end 

    def department_list=(text) 
    if id && text 
     departments.destroy_all 
     text.split(',').each do |d| 
     departments.create(department_name: d.strip.capitalize) 
     end 
    end 
    end 

然后在您的视图中使用@ org.department_list添加一个文本框。编辑

:根据您的扩​​展问题

,你必须要存储和显示为一个数组,但编辑作为一个简单的文本字段中的组织模型,部门领域。我的想法是,我不喜欢在org中将部门数据存储为字段的想法,这是一对多的关系,所以部门应该是一个单独的模型。我会从组织中删除部门字段。然后创建一个迁移来创建一个部门表。它应该是这个样子:

class CreateDeparments < ActiveRecord::Migration 
    def change 
    create_table :departments do |t| 
     t.integer :org_id 
     t.string :department_name 

     t.timestamps 
    end 
    end 
end 

接下来在系车型添加这行代码:

belongs_to :org 

在组织模型中添加以下内容:

has_many :departments, dependent: :destroy 

    def department_list 
    departments.collect { |d| d.department_name }.join(', ') 
    end 

    def department_list=(text) 
    if id && text 
     departments.destroy_all 
     text.split(',').each do |d| 
     departments.create(department_name: d.strip.capitalize) 
     end 
    end 
    end 

在你的控制器并意见您现在有以下内容:

@org = Org.first 
# List of departments as an array for a select 
@org.departments 
# A comma separated string for text boxes 
@org.department_list 

现在可以使用department_list方法在文本框中显示列表,并且还可以使用该方法发布并更改回来。所以,你的视图代码只是变成这样:

<%= f.text_area :department_list, :cols => "10", :rows => "10" %> 

你可能会需要通过改变创造像这样修改你的组织控制器:

def create 
    @org = Org.new(params[:org]) 

    respond_to do |format| 
     if @org.save 
     @org.department_list = params[:org][:department_list] 
     format.html { redirect_to org_url, 
         notice: "#{@org.name} was successfully created" } 
     format.json { render json: @org, 
         status: :created, location: @org } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @org.errors, status: :unprocessable_entity } 
     end 
    end 
end 

如果仍然停留我有一个完整的github上的webiste,你可以查看。对你而言,这是组织和部门,而对于傀儡来说则是人员和技能或人员和信用。这是链接:

https://github.com/davesexton/CKCASTING

+0

其实我在我的模特里有部门领域叫做org。我应该修改什么? – sushilthe

+0

已更新我的回答 –

+0

呈现注册表单时出现以下错误:'未初始化的常量Org :: Department' – sushilthe

相关问题