4

私はプロジェクトに不慣れで、すでに可動部分がたくさんあるシステムに機能を追加しようとしていますが、そのほとんどは、追加しようとしている機能にまったく関連しているとは思えません。

ActiveAdmin/Formtastic フォームにフィールドを追加して、ユーザーが製品に関連付けられた価格体系を作成および更新できるようにしたいと考えています。各製品には、多くの価格レベルを持つことができる 1 つの価格体系があります。

フィールドはフォームに表示されますが、製品オブジェクトを更新すると、価格レベル オブジェクトの料金と最大属性がデータベースに保存されません。

ActiveAdmin フォームには変数、pricing_scheme_object があり、この Stack Overflow Answerに基づいて作成しました。ActiveAdmin フォームは次のようになります。

ActiveAdmin.register Product do
  actions :all, except: [:destroy]
  # menu parent, filters, and scopes, none of which are related
  form html: {multipart: true} do |f|
    f.inputs "Product" do
      # unrelated code
      pricing_scheme_object = [:pricing_scheme, f.object.pricing_scheme ||
                               PricingScheme.new]
      f.inputs "Pricing Schemes", :for => pricing_scheme_object do |scheme|
        scheme.has_many :pricing_tiers do |tier|
          tier.input :fee, input_html: { class: 'pricing_scheme_column'}, size: 5
          tier.input :max, input_html: { class: 'pricing_scheme_column'}, size: 5
        end
      end
      # unrelated code
    end
    f.actions
  end
  # unrelated code
end

製品を保存すると、サーバーに次のように表示されます。

Started PUT "/admin/products/139" for 127.0.0.1 at 2013-03-20 12:50:43 -0700
Processing by Admin::ProductsController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"FzyjTkrTF0LvB1K02kebSgqDQWad8c5/bpbIEhFgQpY=", "product"=>{"three_letter_acronym_id"=>"64", "name"=>"test pdf", "description"=>"<p>this is the pdf </p><div class=\"vimiumReset vimiumHUD\" style=\"right: 150px; opacity: 0; display: none; \"></div>", "status"=>"published", "way"=>"pdf", "custom_path"=>"", "pricing_scheme"=>{"pricing_tiers_attributes"=>{"1363809038085"=>{"fee"=>"30", "max"=>"10"}}}, "allocation_rule_number"=>"", "fulfillment_email"=>"", "fulfillment_username"=>"", "fulfillment_password"=>"[FILTERED]", "fulfillment_url"=>"",  "shared_secret"=>"", "api_key"=>"", "callback_url"=>""}, "commit"=>"Update Product", "id"=>"139"}
  Product Load (0.4ms)  SELECT `products`.* FROM `products` WHERE `products`.`id` = 139 LIMIT 1
WARNING: Can't mass-assign protected attributes: pricing_scheme
   (0.1ms)  BEGIN
[paperclip] Saving attachments.
   (0.1ms)  COMMIT
Redirected to http://localhost:3000/admin/products/139
Completed 302 Found in 119ms (ActiveRecord: 0.0ms)


Started GET "/admin/products/139" for 127.0.0.1 at 2013-03-20 12:50:43 -0700
Processing by Admin::ProductsController#show as HTML
  Parameters: {"id"=>"139"}
  Product Load (0.3ms)  SELECT `products`.* FROM `products` WHERE `products`.`id` = 139 LIMIT 1
  ThreeLetterAcronym Load (0.4ms)  SELECT `three_letter_acronym`.* FROM `three_letter_acronym` WHERE `three_letter_acronym`.`id` = 64 LIMIT 1
  Rendered /Users/strand/.rvm/gems/ruby-1.9.3-p392/bundler/gems/active_admin-c3be25319bb6/app/views/active_admin/resource/show.html.arb (27.3ms)
Completed 200 OK in 144ms (Views: 29.0ms | ActiveRecord: 0.6ms)

製品は次のようになります。

# app/models/product.rb
class Product < ActiveRecord::Base
  # … (probably unrelated code)
  has_one  :pricing_scheme, dependent: :destroy
  accepts_nested_attributes_for :pricing_scheme, allow_destroy: true, reject_if: lambda { |a| a[:price].blank? }
  # … 
  attr_accessible :unrelated_attributes,
                  :pricing_scheme_attributes,
                  :pricing_scheme_id
  # …
end

料金体系モデルは次のとおりです。

# app/models/pricing_scheme.rb
class PricingScheme < ActiveRecord::Base

  attr_accessible :display_order, :label, :product_id, :max_quantity,
                  :min_quantity, :price, :category, :pricing_tiers_attributes

  has_many   :pricing_tiers
  belongs_to :product

  accepts_nested_attributes_for :pricing_tiers, :allow_destroy => true

  def price_for(number)
    # logic to determine the price for a number of products based on the pricing 
    # tiers associated with the pricing scheme.
  end
end

価格レベルは次のようになります。

# app/models/pricing_tier.rb
class PricingTier < ActiveRecord::Base
  attr_accessible :fee, :max, :base, :pricing_scheme_id

  belongs_to :pricing_scheme
end

製品を保存するときに、価格設定スキームとそれに関連付けられている価格レベルを更新または作成したいと考えています。

どうすればいいですか?

4

2 に答える 2

0

:pricing_schemeの最初のオブジェクトとして追加してみてくださいpricing_scheme_object array

f.inputs "Pricing Schemes", :for => [:pricing_scheme, f.object.pricing_scheme || PricingScheme.new] do |scheme|
  scheme.has_many :pricing_tiers do |tier|
    tier.input :fee, input_html: { class: 'pricing_scheme_column'}, size: 5
    tier.input :max, input_html: { class: 'pricing_scheme_column'}, size: 5
  end
end

問題は、params[:pricing_scheme]ではなく渡されているようparams[:pricing_scheme_attributes]です。入力を作成した回答によると、オプションでフィールド名を渡して、:forどの属性にする必要があるかを指定する必要があります。

于 2013-03-21T03:08:01.393 に答える
0

あなたはライセンスを取得しているので、accepts_nested_attributes_for :pricing_tiersライセンスが必要になる可能性がありますか?

于 2013-03-21T14:56:09.340 に答える