Rails RESTful控制器和自定义操作后的渲染

时间:2008-12-04 18:10:56

标签: ruby-on-rails rest redirect action render

如何在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

这不是我的实际代码,只是我刚刚放在一起作为一个例子。

2 个答案:

答案 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代码已经有一段时间......)