2011-02-07 48 views
1

我目前有一个Rails如何执行和响应验证结果的问题。我有一个用户注册表单。用户可以在两个不同的地方打这个表格。他们可能会从主页或从users/new。这两种形式都会发布到同一个地方,因为我试图保持干爽。Rails验证条件重定向

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'行重定向到URL的用户,但并未奏效。有什么我失踪?

+0

因此,当用户在主页上有验证问题时,它不会重定向,它只会呈现错误的视图...对吗? – dontangg 2011-02-07 21:53:37

+0

正确。验证问题将导致用户始终转到用户表单。即使原始表单位于索引页上。不幸的是,需求指定用户可以从两个地方注册。 – 2011-02-07 22:01:27

回答

2

首先,我想补充查询字符串参数,它从像这样的东西来到它发布到与控制器和行动的网址:

# 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所做的“矫枉过正”的评论。

+0

我一直在想这个,并且遇到了与我的代码相同的问题。验证失败两次,并且我永远失去它的位置;你可以调整工作:将`:controller_name => controller.controller_name`替换为::controller_name => params [:controller_name] || params [:controller]`(同样用`:action`),所以它只会使用当前的控制器和动作,如果它之前没有看到它们 - 也就是我们第一次加载表单。我仍然认为这是很多代码,但它的工作原理,我当然不能想到一个更简单的方法... Upvote - 欢呼! – 2011-02-07 23:35:55

0

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

哎呀的简写,它仅适用于成功。对不起

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

+0

虽然这带我到正确的页面,但验证不会在设置时进行设置。通过重定向,我失去了错误信息。 – 2011-02-07 21:47:48

2

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

但是你可以自己使用的引用者信息,并用它来选择合适的页面渲染:

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

注:另一个答案弹出,而我是张贴的提示将旧的控制器/行动领域到你的表格,但这对我来说似乎有点矫枉过正 - 你已经在request.referer有你需要的所有信息。

希望有帮助!