我正在设置此Railscast之后的自动填充关联。
我在虚拟category_name属性上使用find_or_initialize
而不是find_or_create
,因为我需要通过其他逻辑传递值。
如果父模型验证失败(railscast中的Product),则保留此虚拟属性的最佳方法是什么。如果出现错误,我希望在保存路径呈现表单后保留用户输入的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
答案 0 :(得分:0)
我以为我会回答这个问题,因为我遇到了完全相同的问题,我找不到一个答案。
最好的方法是手动验证您需要验证的所有内容。因此,不必使用validates
过滤器来执行此操作,您必须自己在控制器中执行此操作。因此,如果您的属性是用户名,电话和电子邮件,请不要在模型中执行validates :email, presence: true
,而是在控制器中手动执行此操作。这样,如果你有额外的参数,你可以在你的控制器或它的助手中添加另一个验证方法来进行验证,它让你有机会坚持这个。
希望这可以节省人们的时间,因为似乎没有更简单的方法来解决问题。我的意思是,无论如何,rails已经加快了我们的开发时间,更多的代码行不会杀死我们;)