【问题标题】:Rails4: losing form validation errors while using `redirect_to` in controllerRails4:在控制器中使用`redirect_to`时丢失表单验证错误
【发布时间】:2016-01-11 00:47:22
【问题描述】:

我一直在尝试解决这个问题,但还没有解决。如果有人可以让我知道如何做到这一点,或者如果有任何方法我可以使用render 方法来代替,将不胜感激(目前保留错误但重定向到错误的路径,如下所述......) 我有一个表单的自定义路由,当出现验证错误时我试图重定向回来:

get "clubs/sign_up/:plan_id", to: "clubs#new", as: :new_membership

以下是到目前为止我在控制器中的内容以及一些关于我尝试过的其他步骤的 cmets

clubs_controller.rb

def create

    @membership = Membership.new(membership_params)

    if @membership.save
      redirect_to root_path
    else
      flash[:error] = "Please check form errors:"
      redirect_to new_membership_path(session[:membership_plan_id]) #errors lost
      # render action: 'new', plan_id: 'silver' # <<<Preserves errors but breaks path, renders: localhost:3000/clubs instead of .../clubs/sign_up/:plan_id
      # session[:membership_errors] = @membership.errors #<<< Doesn't wotk either, getting a cookie overflow error when trying to pass errors to #new
      return
    end
  end

def new
    session[:membership_plan_id] = params[:plan_id]
    @membership = Membership.new
end

【问题讨论】:

  • 你能分享你的新方法吗?
  • @Tim 已更新,但内容不多。也意识到使用render 可能不起作用,因为您将在创建路径中呈现新的视图,这就是路径错误的原因。因此必须使用redirect_to 来完成
  • 好的,我建议让渲染工作 - 这是正常的方式,渲染路径看起来很奇怪是正常的,渲染实际上并没有运行你的控制器操作,也没有使用你的路由,它只是调用模板。所以你描述的路径很好。诀窍是设置变量以匹配新方法在调用模板时保留它的条件。您是否在视图中使用任何其他变量,例如 param[:plan_I'd]?
  • @Tim 我在视图中使用了 param[:plan_id] 以及我的表单,但仅此而已
  • 好的,最后一个问题,plan_id 是您的会员模型的一部分吗?

标签: ruby-on-rails ruby ruby-on-rails-4 ruby-2.0


【解决方案1】:

假设 plan_I'd 是您模型的一部分..

将渲染线更改为:

render :new

把剩下的改成:

def new
  session[:membership_plan_id] = params[:plan_id]
  @membership = Membership.new plan_id: params[:plan_id]
end

def create

  @membership = Membership.new(membership_params)

  if @membership.save
    redirect_to root_path
  else
    flash[:error] = @membership.errors.full_messages.to_sentence
    render :new
  end
end

并在表单中为 plan_id 添加一个隐藏字段。渲染出错的原因是它没有可用的参数,尝试将其添加到渲染操作不起作用因此您的问题

【讨论】:

    【解决方案2】:

    您需要渲染而不是重定向。在这里使用||= 运算符来提供帮助。这都是红宝石,所以类似于

    (..snip..)
      else
        flash[:error] = "Problem with form"
        new
      end
    end
    
    def new
      session[:membership_plan_id] = params[:plan_id]
      @membership ||= Membership.new
      render 'new'
    end
    

    【讨论】:

    • 解释:在 'create' 方法中,我们只是运行 'new' 而不是执行渲染。然后“新”方法专门调用渲染(因此它不会尝试在创建操作中渲染“创建”)并且我们已经从创建中获得了@membership,因此它不会创建新变量从而清除您的错误。
    猜你喜欢
    • 2013-07-06
    • 2011-07-08
    • 2020-04-24
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    相关资源
    最近更新 更多