获取NoMethodError,如何定义此方法?

时间:2011-10-23 16:50:24

标签: ruby-on-rails ruby ruby-on-rails-3

我在表单上使用名为:all_dates的虚拟属性。该字段的重点是将:purchase_date模型的UserPrice属性替换为:all_dates字段的日期。这样做的原因是用户不必更改他们想要在表单上创建的所有user_price记录的:purchase_date(他们最多可以创建5个),所以它假设要做的就是更新user_prices的列,其日期来自:all_dates字段。


问题

不幸的是,在创建1到5条user_prices记录时,由于:all_dates字段,我得到NoM​​ethodError:

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'

更新

我把NoMethodError放在我的UserPrice模型中去掉了它:

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

但这不正确,因为:all_dates字段不会更新我的UserPrice :purchase_date字段。有没有人有任何想法?


问题

如何定义方法user_prices? 我猜它可以循环UserPrice的几个新记录,但是怎么做?


代码

此表单的作用类似于嵌套表单,但不是使用两个或多个模型,而是使用一个单独的模型(我的UserPrice)在表单上生成更多记录,在我的情况下是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

2 个答案:

答案 0 :(得分:1)

Re:为什么收到错误未定义的方法`user_prices'...

Ans:您需要定义方法user_prices

由于您将模型(对象)命名为UserPrice,因此通常user_price将用于表示模型的实例。

您需要重新考虑user_prices代表什么,UserPrice对象/记录数组?或其他什么?

已添加您是否希望方法save_all_dates_to_user_prices遍历所有UserPrice条记录?

如果是,那么:

  • 您可能希望save_all_dates_to_user_prices成为类方法,因为它将处理类的多个实例。

  • 该方法需要首先加载一个包含所有当前记录的数组。使用类方法find或scope

  • 执行此操作

答案 1 :(得分:0)

我采用了一种完全不同的方法,并且仍能在本课题中得到相同的结果:How to update a model's attribute with a virtual attribute?