我在表单上使用名为:all_dates
的虚拟属性。该字段的重点是将:purchase_date
模型的UserPrice
属性替换为:all_dates
字段的日期。这样做的原因是用户不必更改他们想要在表单上创建的所有user_price记录的:purchase_date
(他们最多可以创建5个),所以它假设要做的就是更新user_prices的列,其日期来自:all_dates
字段。
问题
不幸的是,在创建1到5条user_prices记录时,由于: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'
更新
我把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
答案 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?