2

如何在 restful 控制器中执行操作而不是重定向后进行渲染。

我有一个带有标准操作的控制器,并且我添加了一个特殊操作,通过#show 页面上的一个表单将数据添加到相关资源中(想想帖子上的评论)。我正在验证表单的输入,并希望在错误时重新呈现显示操作并在成功时重定向到显示操作。

我想渲染以防止用户两次输入他们的信息,但是当我尝试在 flash[:notice] 中渲染显示操作时出现错误时,我收到一条错误消息,指出我没有指定 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

这不是我的实际代码,只是我刚才作为示例放在一起的东西。

4

2 回答 2

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 %>

这样,表单中的输入将预先填充用户输入的内容。

于 2008-12-04T18:34:16.667 回答
0

创建一个新的数据对象并添加表单中的值,在重新渲染之前,认为它会起作用。如果您仍然遇到问题,请尝试设置一个布尔值来编辑新行和现有行,或者完全创建两个不同的视图。

我以前做过,但我不太记得是怎么做的。有时当我使用 MVC 模式的典型用法时,它几乎是“自动的”,有时(因为我不得不使用一个古老的古怪数据库)我必须自己编写所有的魔法;有时.new?在 ActiveRecord 对象上使用函数(或它被调用的函数),有时我对 ID 使用临时的“魔术值”(通常是字母字符串来表示无效的 id 值。

(如果我犯了一些错误,我深表歉意,我已经有一段时间没有编写 Rails 代码了......)

于 2008-12-04T18:38:21.620 回答