build method on ruby on rails

Finks picture Finks · Nov 4, 2013 · Viewed 46.6k times · Source

New to rails and I'm following the Depot project found in the Agile web development with rails 3.1. Everything was fine until I got lost when the book used the "build" method.

@cart = current_cart
product = Product.find(params[:product_id])
@line_item = @cart.line_items.build(product: product)

My google searches led me to understand that the .build method is just a cleaner way to create a row in the table (with association between tables). But on the code above, I was expecting the code would look like something like this:

@line_item = @cart.line_items.build(product_id => params[:product_id])

I don't understand why the author had to store the whole row of products( product = Product.find(params[:product_id])) instead of just getting the product_id...

Is there more to it than what I can understand?

Answer

Billy Chan picture Billy Chan · Nov 4, 2013

You misunderstood build. It's just an alias of new, nothing special. https://github.com/rails/rails/blob/959fb8ea651fa6638aaa7caced20d921ca2ea5c1/activerecord/lib/active_record/relation.rb#L84

build won't "create" a record in database, just create a new object in memory so that the view can take this object and display something, especially for a form.

For your second question, yes, your way of composing by id will work as well. But a better approach is not to trust param. Instead, verify it by finding in db at first.