最好的方法是通过你的模型。我假设您有一个名为 Org 的模型和另一个名为 Department 的模型,并且您已经定义了两者之间的许多关系。然后,您需要做的就是在您的 Org 模型中添加以下代码:
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
接下来在 Department 模型中添加这行代码:
belongs_to :org
在 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" %>
您可能需要通过将 create 更改为以下内容来修改您的 org 控制器:
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 上有一个完整的网站,您可以浏览一下。对你来说是组织和部门,在我的网站上是人员和技能或人员和学分。这是链接:
https://github.com/davesexton/CKCASTING