基于当前控制器操作的重定向

时间:2012-11-06 09:18:15

标签: ruby-on-rails

目前,我有两个使用users#create操作的观点:users/new.thml.erbenter_email.html.erb

问题在于,使用当前代码时,用户会被重定向到new.html.erb enter_email.html.erb中的表单有验证错误。所以我尝试了这个:

  def create
    @user = User.new(params[:user])
    if @user.save
      sign_in @user
      flash[:success] = "Welcome to the Sample App!"
      redirect_to @user
    else
      if params[:action] == "enter_email"
        render 'enter_email'
      else
        render 'new'
      end
    end
  end

我希望用户在操作'enter_email'时被重定向到enter_email.html.erb。但我仍然被重定向到'new.html.erb'。

有任何解决此问题的建议吗? (这是因为正在执行的操作实际上是create?如果是,如何修改代码以使重定向工作?)

2 个答案:

答案 0 :(得分:3)

我看到了几种方法:

  • 在两个表单中添加隐藏字段,并在params中查看该字段的值,以便了解您来自哪个表单

    # in your new.html.erb view
    hidden_field_tag 'form_name', 'new'
    
    # in your enter_email.html.erb view
    

    hidden_​​field_tag'form_name','enter_email'

    # in controller
    if params[:form_name] == "enter_email"
      render 'enter_email'
    else
      render 'new'
    end
    
  • 使用其他操作进行创建,例如create_from_enter_email,并将enter_email表单指向它。

答案 1 :(得分:2)

正如您所想,问题是操作是create而不是enter_email,因此if / else条件总是转到else分支并呈现new视图。

要呈现上一个视图,您可以按this answer中的建议使用request.referrer

def create
  @user = User.new(params[:user])
  if @user.save
    sign_in @user
    flash[:success] = "Welcome to the Sample App!"
    redirect_to @user
  else
    if request.referrer == root_url
      render 'enter_email'
    else
      render 'new'
    end
  end
end

我正在检查request.referrerroot_url是否基于登录部分在主页上的事实(您在下面的评论中提到)。这应该有用。