Rails验证条件重定向

时间:2011-02-07 21:37:14

标签: ruby-on-rails validation

我目前遇到Rails如何执行和响应验证结果的问题。我有一个用户注册表。用户可以在两个不同的地方点击此表单。他们可以从主页或users/new点击表单。两种形式都会发布到同一个地方,因为我试图让它干涸。

users/new页面按预期工作。如果用户有验证问题,它将返回并填充表单。我在哪里遇到问题在主页上。如果用户有验证问题,它现在会重定向到users/new页面。我更喜欢在主页上将用户返回到同一页面并在那里显示验证结果。控制器中是否有一种方法可以重定向到用户所在的表单?

def create
  @user = User.new(params[:user])

  respond_to do |format|
    if @user.save
      format.html { redirect_to(@user, :notice => 'User was successfully created.') }
      format.xml  { render :xml => @user, :status => :created, :location => @user }
    else
      format.html { render :action => "new" } # I'm thinking I can do something here?
      format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
    end
  end
end

我尝试更改render :action => 'new'行以重定向到用户网址,但它无效。有什么我想念的吗?

3 个答案:

答案 0 :(得分:2)

首先,我会将querystring参数添加到它发布到的URL中,控制器和来自它的动作是这样的:

# Using form_tag
<%= form_tag user_path(@user, :controller_name => controller.controller_name, :action_name => controller.action_name) do %>

# Using form_for
<%= form_for @user, :url => user_path(@user, :controller_name => controller.controller_name, :action_name => controller.action_name) do %>

然后,您可以在控制器的create操作中更新该行,如下所示:

render '#{params[:controller_name]}/#{params[:action_name]}'

<强>更新

我刚刚意识到使用上面的代码会在第一次验证失败时呈现正确的视图,但如果第二次验证失败,它将尝试呈现users/create视图。如果这是您要采用的路线,则不应在视图中使用controller.controller_name等,而是正确分配@controller_name并使用该变量。但是,这只会增加Xavier的“矫枉过正”评论。

答案 1 :(得分:2)

艺术在正确的轨道上,但您不能使用重定向,因为您需要在控制器中设置的实例变量@user,这将在新的HTTP请求中丢失(因为任何请求都是由一个新的,干净的控制器实例处理。)

但您可以自己使用引用者信息,并使用它来选择要呈现的正确页面:

render :action => (request.referer =~ /\/users\/new/)? :new : :index

注意:我在发帖时弹出了另一个答案,建议在表单中添加旧的控制器/操作字段,但这对我来说似乎有些过分 - 您已经在request.referer中获得了所需的所有信息。 / p>

希望有所帮助!

答案 2 :(得分:0)

尝试redirect_to :back
这是redirect_to(request.env["HTTP_REFERER"])

的简写 哎呀,它只适用于成功。遗憾

好吧,那么你必须检查他来自的块(在format.html之后)(通过查看request.env [“HTTP_REFERER”])并呈现相应的动作。