1

现在,我有两个正在使用该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.html.erb在操作为“enter_email”时被重定向到。但我仍然被重定向到“new.html.erb”。

有什么建议可以解决这个问题吗?(这是因为正在执行的动作实际上是create?如果是这样,如何修改代码以使重定向起作用?)

4

2 回答 2

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表单指向它。

于 2012-11-06T10:04:53.680 回答
2

如您所想,问题在于操作 iscreate和 not enter_email,因此 if/else 条件总是转到 else 分支并new呈现视图。

要呈现以前的视图,您可以按照此答案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.referrer基于root_url登录部分位于主页上的事实(您在下面的评论中提到)。这应该有效。

于 2012-11-06T09:27:40.033 回答