2011-10-23 5 views
0

私のフォームに:all_datesという仮想属性を使用しています。このフィールドのポイントは、私のUserPriceモデルの:purchase_date属性を、:all_datesフィールドの日付に置き換えることです。これは、ユーザーがフォーム上に作成するすべてのuser_priceレコードの:purchase_dateを変更する必要がないためです(最大5つ作成できます)。 user_pricesには、:all_datesフィールドから与えられた日付が入ります。残念ながらNoMethodErrorを取得するにはどうすればこのメソッドを定義できますか?


問題

user_pricesの1〜5レコードを作成するには、私は理由:all_datesフィールドのNoMethodErrorを得る:

NoMethodError (undefined method `user_prices' for #<UserPrice:0x485d918>): 
    app/models/user_price.rb:54:in `save_all_dates_to_user_prices' 
    app/controllers/user_prices_controller.rb:27:in `each' 
    app/controllers/user_prices_controller.rb:27:in `create_multiple' 

UPDATE

私が得ましたこれを私の使用に入れてNoMethodErrorを取り除くrPriceモデル:

def user_prices 
    @user_prices = Array.new() { UserPrice.new } 
end 

しかし:all_datesフィールドが私のUserPrice :purchase_dateフィールドを更新しないので、それは正しくありません。誰にもアイデアはありますか?


質問

は、どのように私は方法user_pricesを定義していますか? 私はUserPriceのいくつかの新しいレコードをループすることができると推測していますが、それはどのように行われますか?


コード

この形式は、私の場合には、ネストされた形のようではなく、単にフォーム上に複数のレコードを生成するために、私のUserPriceをある1つのモデルを使用して2つの以上のモデルにそのを使用しての行為5つの新しいものです。

<%= form_tag create_multiple_user_prices_path, :method => :post do %> 
<%= date_select("user_price", "all_dates" %> 
    <% @user_prices.each_with_index do |user_price, index| %> 
     <%= fields_for "user_prices[#{index}]", user_price do |up| %> 
      <%= render "add_store_price_fields", :f => up %> 
     <% end %> 
    <% end %> 
<% end %> 

class UserPrice < ActiveRecord::Base 
    attr_accessible :price, :product_name, :all_dates 
    attr_accessor :all_dates 
    after_save :save_all_dates_to_user_prices 

    protected 

    def save_all_dates_to_user_prices 
     self.user_prices.each {|up| up.purchase_date = self.all_dates if up.new_record?} 
    end 

class UserPricesController < ApplicationController 

    def new 
    @user_prices = Array.new(5) { UserPrice.new } 
    end 

    def create_multiple 
    @user_prices = params[:user_prices].values.collect { |up| UserPrice.new(up) } 
    if @user_prices.all?(&:valid?) 
     @user_prices.each(&:save!) 
     redirect_to :back, :notice => "Successfully added prices." 
    else 
     redirect_to :back, :notice => "Error, please try again." 
    end 
    end 
+1

一つの問題:date_select 'の最初の引数'はオブジェクト(user_price)の名前である必要があり、2番目のものは' all_dates'でなければなりません。また、生成されたHTMLの外観を見てください。 – Zabba

+0

@Zabbaありがとう、私はそれが今正しいと思う、今私の編集をチェックしてください。エラーは異なります。 – LearningRoR

答えて

1

再:あなたがメソッドuser_prices

を定義する必要があります。なぜエラーに...

アンスため未定義のメソッド `user_prices'を受けます

モデル(オブジェクト)UserPriceに名前を付けたので、通常はモデルのインスタンスを表すためにuser_priceが使用されます。

UserPriceオブジェクト/レコードの配列であるuser_pricesの表現を再考する必要がありますか?または、他の何か?

save_all_dates_to_user_pricesのメソッドをUserPriceのすべてのレコードで繰り返し処理しますか?その後、

その場合、:

  • それは、クラスの複数のインスタンスを扱うことになるので、あなたはおそらくsave_all_dates_to_user_pricesは、クラスメソッドになりたいです。

  • この方法では、すべての現在のレコードで最初に配列をロードする必要があります。クラスメソッドでこれを行う見つけるかscope

関連する問題