After validation fails and a form redirects back to itself, why are instance variables empty?
ruby-on-rails
Solution
It's because you don't actually execute the "new" action if it fails. Here's a typical controller structure
class PotsController < ApplicationController
def new
@pot = Pot.new
@users = User.all
end
def create
@pot = Pot.new(params[:pot])
if @pot.create
redirect_to @pot, notice: "Created"
else
#****you are here****
render :new
end
end
end
In the above, if `pot.create` fails, it just renders the new template. What you should do is get your instance variables in that case too
def create
@pot = Pot.new(params[:pot])
if @pot.create
redirect_to @pot, notice: "Created"
else
@users = User.all #this is the important line
render :new
end
end
Problem
In a Rails 3.2 app, when a certain form fails to save (validation fails) and redirects back to the form I get an error: ``` undefined method `map' for nil:NilClass ``` This form does not display any errors when navigating directly to the new or edit paths. The error is coming from a select field with a custom `options_from_collection_for_select` method. ``` <%= f.select(:user_ids, options_from_collection_for_select_with_attributes(@users, :id, :name, 'data-attributes', :attributes ), {include_blank:true}, {multiple:true}) %> ``` If I replace the instance variable `@users` with `User.all` then I don't get an error after redirect. I guess `@users` is empty after the redirect, hence the error. But why? `@users` is defined in the new and edit controllers. My controller is: ``` def create --bunch of stuff if @model.save --bunch of stuff respond_to do |format| format.html { render :text => model_url(@model) } format.html { redirect_to(@model, :notice => 'Success!.') } format.xml { render :xml => @model, :status => :created, :location => @model } end else respond_to do |format| format.html { render :action => "new" } format.xml { render :xml => @model.errors, :status => :unprocessable_entity } end end end ```