SoSimple
SoSimple

Reputation: 701

Rails 4 Passing Parameters From One Controller to Another

I have a clients controller and and payments controller. When a client is created I want to automatically redirect to a new payment form and also pass the client id to payments.

In the clients model:

has_many :payments

In the payments model:

belongs_to :client

In clients controller:

def create
@client = Client.new(client_params)

respond_to do |format|
  if @client.save
    format.html { redirect_to new_payment_url (:client_id => @client.id) }
    format.json { render action: 'show', status: :created, location: @client }
  else
    format.html { render action: 'new' }
    format.json { render json: @client.errors, status: :unprocessable_entity }
  end
end

end

In payments controller

  def new
    @payment = Payment.new
    @client = Client.where(:id => params[:client_id])
  end

When I create a client it redirects to the new payments form but the client id does not get passed. When I try to save that payment I get an error saying client can't be blank.

I know that you can't pass an object to another controller without first saving it but my understanding was: i) I'm not trying to pass through the entire client object, just the id and ii) doesn't @client.save save the object to the DB then execute and following lines of code?

I'm a little confused about all of this so any help at all would be much appreciated.

Upvotes: 2

Views: 7332

Answers (3)

neongrau
neongrau

Reputation: 953

You only instantiate a new Client via the line

@client = Client.new(client_params)

By that @client will not have an id until the record is saved.

Since i assume you want to create a record and then further process that data actually persist the record by calling create instead of new.

@client = Client.create(client_params)

Upvotes: 1

Sanjiv
Sanjiv

Reputation: 843

Try changing this line:

format.html { redirect_to new_payment_url (:client_id => @client.id) }

to look like this:

format.html { redirect_to new_payment_path(:client_id => @client.id) }

If the above does not work, then pass the 'path' string to redirect_to like these "/payment/new?client_id=#{@client.id}".

Upvotes: 0

Ju Liu
Ju Liu

Reputation: 3999

Try changing this line

format.html { redirect_to new_payment_url (:client_id => @client.id) }

to look like this

format.html { redirect_to new_payment_url(:client_id => @client.id) }

Upvotes: 2

Related Questions