0

リストモデルがあります。リストにはタグが埋め込まれています(Mongoidを使用)。ユーザーがリストを作成するとき、テキストフィールドのコンマ区切りリストを介して関連タグを指定できます。

リストアソシエーションを介してタグを保存するにはどうすればよいですか?リストモデルのaccepts_nested_attributes_for:tagsを使用してそれを行うことはできますか、それともタグ文字列を前処理する必要がありますか?

これが私がこれまでに持っているものです。タグ文字列を処理し、分割して、リストの一部である埋め込みタグドキュメントに各タグを個別に保存するにはどうすればよいですか?

リストコントローラー:

class ListsController < ApplicationController
  def new
    @list = List.new

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @list }
    end
  end

  def create
    list_params = params[:list]
    list_params[:user_id] = current_user.id
    @list = List.new(list_params)
    if @list.save
     redirect_to @list, notice: 'List was successfully created.'
    else
      render action: "new"
    end
  end
end

リスト作成フォーム

= form_for @list do |f|
  - if @list.errors.any?
    #error_explanation
      %h2= "#{pluralize(@list.errors.count, "error")} prohibited this list from being saved:"
      %ul
        - @list.errors.full_messages.each do |msg|
          %li= msg

  .field
    = f.label :name
    = f.text_field :name
  .field
    = f.label :description
    = f.text_field :description
  .field
    = f.fields_for :tags do |t|
      = t.label :tags
      = t.text_field :name
  .actions
    = f.submit 'Save'

リストモデル

class List
  include Mongoid::Document
  include Mongoid::Timestamps
  field :name
  field :description
  embeds_many :items
  embeds_many :comments
  embeds_many :tags
  belongs_to :user

  accepts_nested_attributes_for :tags

タグモデル

class Tag
  include Mongoid::Document
  field :name
  has_one :list
end

Geoffの提案に基づいて編集する

リストコントローラーは最終的に見えました。

 def create
    tags = params[:tags][:name]
    list = params[:list]
    list[:user_id] = current_user.id
    @list = List.new(list)
    tags.gsub("\s","").split(",").each do |tag_name|
      @list.tags.new(:name => tag_name)
    end
    if @list.save
     redirect_to @list, notice: 'List was successfully created.'
    else
      render action: "new"
    end
  end
4

1 に答える 1

1

私があなたを正しく理解しているなら、これがあなたがやりたいと思うことです:

ビューをそのまま表示すると、各タグのタグ名フィールドが表示されますが、作成時に関連付けられたタグがないため、何も表示されないと思います。

を使用する場合:has_many、と呼ばれるレールによって作成される素敵な小さな関数がありますList.tag_ids。なじみがないので、の機能:embeds_manyはのスーパーセットだと思います:has_many。これのポイントは、IDを収集するある種のフォームを提供できれば、それで完了だということです。チェックボックスのセットが機能するか、複数選択できます。チェックボックスは次のようになります。

= hidden_field_tag "list[tag_ids][]"
- Tags.all.each do |t|
  = check_box_tag "list[tag_ids][]", t.id, t.list == @list, id: "list_tag_ids_#{t.id}"
  = label_tag "list_tag_ids_#{t.id}", t.name

私はここで似たようなことを尋ねました:

Rails:既存のモデルにhas_manyアソシエーションをトランザクションで追加するにはどうすればよいですか?

しかし、これはあなたが求めていたものではありません。javascriptを使用して、名前でタグを関連付けるフォームを作成できます。それはおそらくいいことですが、少し注意が必要です。

JavaScriptがないと仮定すると、ビューで名前をコンマ区切りのリストとして入力する場合は、コントローラーでそれを解析する必要があります。これに似ています:

意見:

label_tag :tags
text_field_tag :tags

コントローラ:

...
@list = List.new(list_params)
params[:tags].gsub("\s","").split(",").each do |tag_name|
  tag = Tag.find_by_name(tag_name)
  @list.tags << tag if tag
if @list.save
...

私が提案したソリューションはどれも、ネストされた属性を利用していません。ここでは当てはまらないと思います。これらは、ネストされたモデルの属性を更新しようとしているが、関連付けを作成しようとしているときに使用されます。

それがお役に立てば幸いです。

于 2013-01-15T21:04:21.870 に答える