整个代码来自这个问题:Nested form validations not working in rails app
验证有效,但现在问题出在error_message上。它根本就没有出现。
我发现由于我的控制器中的redirect_to,它无法正常工作:
class MessagesController < ApplicationController
def create
@trip = Trip.find(params[:trip_id])
@message = @trip.messages.create(params[:message])
if @trip.messages.create
MessageMailer.send_message(@message).deliver
redirect_to thank_you_path
else
redirect_to trip_path(@trip)
end
end
end
我必须使用渲染。但问题是如何?
此消息表单位于另一个模型显示页面内,如果消息未通过验证,我想在同一个显示页面中看到错误消息。
你能帮帮忙吗? 谢谢!更新
rake routes
messages GET /messages(.:format) {:action=>"
index", :controller=>"messages"}
POST /messages(.:format) {:action=>"
create", :controller=>"messages"}
new_message GET /messages/new(.:format) {:action=>"
new", :controller=>"messages"}
edit_message GET /messages/:id/edit(.:format) {:action=>"
edit", :controller=>"messages"}
message GET /messages/:id(.:format) {:action=>"
show", :controller=>"messages"}
PUT /messages/:id(.:format) {:action=>"
update", :controller=>"messages"}
DELETE /messages/:id(.:format) {:action=>"
destroy", :controller=>"messages"}
trip_messages GET /trips/:trip_id/messages(.:format) {:action=>"
index", :controller=>"messages"}
POST /trips/:trip_id/messages(.:format) {:action=>"
create", :controller=>"messages"}
new_trip_message GET /trips/:trip_id/messages/new(.:format) {:action=>"
new", :controller=>"messages"}
edit_trip_message GET /trips/:trip_id/messages/:id/edit(.:format) {:action=>"
edit", :controller=>"messages"}
trip_message GET /trips/:trip_id/messages/:id(.:format) {:action=>"
show", :controller=>"messages"}
PUT /trips/:trip_id/messages/:id(.:format) {:action=>"
update", :controller=>"messages"}
DELETE /trips/:trip_id/messages/:id(.:format) {:action=>"
destroy", :controller=>"messages"}
答案 0 :(得分:1)
class MessagesController < ApplicationController
def create
@trip = Trip.find(params[:trip_id])
@message = @trip.messages.build(params[:message])
if @message.save
MessageMailer.send_message(@message).deliver
redirect_to thank_you_path
else
render "edit"
end
end
end
然后,您应该在_edit.html.erb
中有一个名为views/messages
的部分内容,其中包含您的表单以及用于呈现错误的代码。
您的edit.html.erb
可能就像render "edit"
快速评论:
你应该改变这个:
form_for([@trip, @trip.messages.build])
到
form_for([@trip, @message])
并在@message
操作中设置@message = @message.new
(new
)。这样,您可以使用相同的表单进行新操作和编辑操作。
您还可以考虑使用像simple_form
这样的宝石,这样可以更轻松地创建表单,并且内联显示错误。
答案 1 :(得分:0)
render "/other_model/show"
渲染会保留当前的实例变量,因此如果“if”语句失败,验证将加载带有错误的@trip
变量,并将反映在新渲染的表单中。