0

このRailscastに従ってオートコンプリートの関連付けを設定しています。

他のロジックを介して値を渡す必要があるため、仮想の category_name 属性ではfind_or_initializeなくを使用しています。find_or_create

親モデルの検証が失敗した場合に、この仮想属性を永続化する最善の方法は何ですか (Railscast の製品)。category_nameエラーが発生した場合、保存パスがフォームをレンダリングした後もユーザーが入力したものを残しておきたい。

から値にアクセスできると思っていparams[:category_name]ましたが、フィールドに戻すことができません。

どんなアイデアにも感謝します。

編集

コントローラ

class ProductsController < ApplicationController

  ...

  def create
    @product = current_user.products.build(params[:prerep])

    if @products.save
      DO SOME STUFF...

      respond_to do |format|
        format.html { redirect_to(@product, :notice => 'Product was successfully created.') }
        format.xml  { render :xml => @product, :status => :created, :location => @product }
      end

    else
      respond_to do |format|
        format.html { render :action => "new" }
        format.xml  { render :xml => @product.errors, :status => :unprocessable_entity }
      end
    end
  end
end

モデル:

class Prerep < ActiveRecord::Base
  attr_accessible ..., :category_name, ... 
  attr_reader ...
  attr_accessor ...

  belongs_to :user, :category

  has_many ...

  validates ...

  def category_name
    category.try(:name)
  end  

  def category_name=(name)
    product_category = Category.find_or_initialize_by_name(name) if name.present?
    self.category = if product_category.new_record?
      product_category ...SET SOME ATTRIBUTES...
      product_category.save(:validate => false)
      product_category
    else
      product_category
    end
  end
end
4

1 に答える 1