2009-06-05 13 views
11

Sono nuovo di ruby ​​su rail e sto lavorando con la versione 2.3 su mac osx. sto provando a creare la stessa funzionalità creata da uno scaffold, ma da solo. Ho creato un controller, una vista e un modello "post". controller alberino, ho il seguente:variabile di istanza vs simbolo in ruby ​​on rails (form_for)

class PostController < ApplicationController 
    def index 
    end 

    def new 
    @post = Post.new 
    end 
end 

in new.html.erb, ho il seguente:

<h1>New Post</h1> 

<% form_for :post do |f| %> 

    <%= f.text_field :title %> 

<% end %> 

ho notato che nello scaffold codice generato, l'uso della variabile di istanza @post per il form_per helper. perché usano la variabile di istanza nel modulo generato dallo scaffold se si passa il simbolo: post in form_for fa esattamente la stessa cosa, mentre un simbolo richiede di cambiare la configurazione dei percorsi?

vi ringrazio molto, Yuval

risposta

15

se si utilizza il simbolo: inviare crea

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

se si utilizza l'istanza @post

per @post = Post.new otterrete

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

per @post = Post.find (1) riceverai

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

se hai forme diverse per la tua nuova e la tua modifica non è un grosso problema ma più o meno il tuo nuovo e i tuoi moduli di modifica saranno identici o vicini allo

quindi se usi la variabile di istanza @post puoi inserisci tutto il codice del modulo in _form e chiama il partial e gestirà il resto in base a se passi un nuovo record o un record esistente

+0

grazie mille. che chiarisce :) –

+3

l'importanza di quel metodo _ nascosto è che i browser non supportano i metodi put ed delete, quindi devi far sapere all'applicazione quando un metodo post è pensato per essere un put o un delete, per fortuna rotaie magicamente gestisce questo per noi – ErsatzRyan

+0

Devi usare @post sul nuovo modulo, e ti serve anche se i tuoi moduli sono separati. Altrimenti, quando crei un nuovo post con dati non validi e torna al nuovo modulo con errori di convalida, non verrà compilata l'informazione che hai inserito. –

0

Una possibile ragione è che rende il codice per il modulo per creare un nuovo post più simile al codice di un modulo per aggiornare un post esistente.

+0

grazie per la tua risposta –