これを行う最善の方法は、モデルを使用することです。Org と呼ばれるモデルと Department と呼ばれる別のモデルがあり、2 つの間に has many 関係が定義されていると想定しています。あとは、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 を使用してテキスト ボックスを追加します。
編集:
拡張された質問に基づいて、配列として保存して表示し、単純なテキスト フィールドとして編集する組織モデルに部門フィールドがあります。これについての私の考えは、部門データを組織のフィールドに保存するという考えが気に入らないということでした。これは1対多の関係であるため、部門は別のモデルにする必要があります。組織から部門フィールドを削除します。次に、部門テーブルを作成するための移行を作成します。次のようになります。
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
組織モデルに以下を追加します。
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 を次のように変更して、組織コントローラーを修正する必要があるでしょう。
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 に完全なウェブサイトがあります。あなたにとってそれは組織と部門であり、mysite では人とスキル、または人とクレジットです。これはリンクです:
https://github.com/davesexton/CKCASTING