我有两个对象用户板的表单
这是我的控制器:
def create
@board = Board.new(params[:board])
@user = User.new(params[:user])
respond_to do |format|
if (@user.save and @board.save)
format.js {redirect_to some_path}
else
format.js {render :action => "new" }
end
end
end
除非两者都有效,否则我不想保存任何一个。我想在表单上同时显示两者的错误消息。
我尝试了'&&'的所有类型的组合'&安培;' '和'但他们没有给我我想要的结果。它们在保存另一个对象时显示一个对象的错误。
我该如何正确地做到这一点?
答案 0 :(得分:3)
&&
与Linux中的&&
不同。
你有两种选择。您可以检查记录是否为valid?
,然后执行保存。
def create
@board = Board.new(params[:board])
@user = User.new(params[:user])
respond_to do |format|
if @user.valid? && @board.valid?
@user.save!
@board.save!
format.js { redirect_to some_path }
else
# do something with #errors.
# You check the existence of errors with
# @user.errors.any?
# @board.errors.any?
# and you access the errors with
# @user.errors
# @board.errors
format.js { render :action => "new" }
end
end
end
或者如果您的数据库支持事务,请使用事务。
def create
@board = Board.new(params[:board])
@user = User.new(params[:user])
respond_to do |format|
begin
transaction { @user.save! && @board.save! }
format.js { redirect_to some_path }
rescue ActiveRecord::RecordInvalid
format.js { redirect_to some_path }
end
end
end
就个人而言,我会检查valid?
。
答案 1 :(得分:0)
如果你查看ActiveRecord的save方法的源代码,你会看到:
def save(options={})
perform_validations(options) ? super : false
end
您要做的是,在调用save之前手动运行perform_validations。为此,你可以使用有效的?来自ActiveResource的方法。您可以在这里找到文档:
http://api.rubyonrails.org/classes/ActiveRecord/Validations.html#method-i-valid-3F