views:

594

answers:

2

hi, i'm new to ruby on rails and am working with version 2.3 on mac osx. i am trying to create the same functionality a scaffold creates, but on my own. i created a "post" controller, view, and model. in post controller, i have the following:

class PostController < ApplicationController
  def index
  end

  def new
    @post = Post.new
  end
end

in new.html.erb, i have the following:

<h1>New Post</h1>

<% form_for :post do |f| %>

    <%= f.text_field :title %>

<% end %>

i noticed that in the scaffold generated code, the use the instance variable @post for the form_for helper. why do they use the instance variable in the scaffold generated form if passing the symbol :post in form_for does the exact same thing, while a symbol requires changing the config of the routes?

thank you very much, yuval

A: 

One possible reason is that it makes the code for the form to create a new post more similar to the code for a form to update an existing post.

Matt Gillooly
thank you for your answer
yuval
+6  A: 

if you use symbol :post it creates

<form action="/posts" method="post">

if you use the instance @post

for @post = Post.new you will get

<form action="/posts/create" class="new_account" id="new_account" method="post">

for @post = Post.find(1) you will get

<form action="/posts/update" class="edit_account" id="edit_account_1" method="post">
<input name="_method" type="hidden" value="put">

if you have different forms for your new and your edit no big deal but more likey than not your new and your edit forms are going to be identical or close to it

so if you use the instance variable @post you can put all the form code into _form and just call the partial and it will handle the rest based on if you pass in a new record or an existing record

ErsatzRyan
thank you very much. that makes it clear :)
yuval
the importance of that hidden _method is that browsers don't support put and delete methods so you have to let the application know when a post method is meant to be a put or a delete, thankfully rails magically handles this for us
ErsatzRyan
You need to use @post on the new form, and you need it even if your forms are separate. Otherwise, when you create a new post with invalid data and it goes back to the new form with validation errors, it won't fill in the information you had entered.
Sarah Mei