如何在restful控制器中执行操作而不是重定向后渲染。
我有一个带有标准操作的控制器,我添加了一个特殊操作,通过#show页面上的一个表单向相关资源添加数据(想想帖子上的评论)。我正在验证表单中的输入,并希望在出错时重新呈现show动作,并在成功时重定向到show动作。
我想渲染以防止用户输入他们的信息两次,但是当我尝试使用flash [:notice]中的错误渲染show动作时,我收到一条错误消息,指出我没有指定ID。当我指定ID时,它会尝试渲染一个尚不存在的新模板。
我认为应该是这么简单:
def add_comment
if my_validation?
save the object
redirect_to :action => "show", :id => params[:id]
else
render :action => "show", :id => params[:id]
end
end
这不是我的实际代码,只是我刚刚放在一起作为一个例子。
答案 0 :(得分:2)
最好的方法是重新渲染:new
def create
@obj = TheObject.new(params[:object])
render :action => :new unless @obj.save
end
在new.html.erb
中<% form_for :obj,
:url => object_url(@obj), :html => {:method => :post} do |f| %>
<%= f.text_field :name %>
<% end %>
这样,表单中的输入将预先填入用户输入的内容。
答案 1 :(得分:0)
创建一个新的数据对象并在重新渲染之前添加表单中的值,然后认为它可以正常工作。如果仍然遇到问题,请尝试设置布尔值以编辑新行与现有行,或者完全创建两个不同的视图。
我以前做过,但我不记得怎么做。有时当我使用MVC模式的非常典型的使用时,它几乎是“自动的”,其他的(因为我不得不使用旧的古怪数据库)我必须自己编写所有魔法;有时使用ActiveRecord对象上的.new?
函数(或它所调用的函数),其他我使用ID的临时“魔术值”(通常是无效id值的字母字符串。
(我道歉,如果我犯了一些错误,我编写Rails代码已经有一段时间......)