L457
L457

Reputation: 1032

Rails4: losing form validation errors while using `redirect_to` in controller

I've been trying to fix this for a while but haven't gotten anywhere yet. Would appreciate if someone could let me know how how this can be done, or if there is any way i can use the render method to do this instead (currently preserves errors but redirects to wrong path as mentioned below...) I have a custom route for form which I am trying to redirect back when there are validation errors:

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

below is what I have so far in my controller along along with some comments regarding other steps I have tried

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

Upvotes: 1

Views: 906

Answers (2)

Tim
Tim

Reputation: 1005

Assuming plan_I'd is part of your model..

Change your render line to:

render :new

Change the rest to:

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

And add a hidden field for plan_id in your form. The reason render goes wrong is that it does not have the param available, trying to add it to the render operation does not work hence your issue

Upvotes: 1

court3nay
court3nay

Reputation: 2365

You need to render instead of redirecting. Use the ||= operator to help here.. It's all just ruby, so something like

(..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

Upvotes: 0

Related Questions