2009-12-15 18 views
18

estoy tratando de hacer una forma no-modelo en el rubí en los carriles, la mayoría de los ejemplos que se pueden encontrar sólo tienen un campo (por ejemplo un campo de búsqueda) o utilizar una vieja manera de escribir un formulario como el siguiente An Email Form with Ruby on Rails¿Cómo hacer un formulario que no sea modelo en ruby ​​on rails?

Si alguien pudiera mostrarme un código de ejemplo de un formulario que no sea un modelo con dos campos para la vista y cómo accedo a esos campos en el controlador, le agradecería.

Muchas gracias.

+0

También he notado algunos comentarios en la web que dan a entender que las formas no-modelo son un dolor para validar, ese ser ¿sería más fácil usar un estilo de "forma para" para un formulario de contacto? – conspirisi

+0

Echa un vistazo a la gema validable para una fácil validación de objetos que no son de base de datos. http://github.com/jnunemaker/validatable –

+0

Para restaurar los valores de entrada en la validación fallida: http://stackoverflow.com/questions/4129229/rails-restoring-contents-of-non-model-form-that-uses- form-tag/24974457 # 24974457 –

Respuesta

32

Tendrá FormHelper métodos:

decir que quieres una simple acción de test que se somete a la acción do_test:

A simple vista para la acción de prueba (mensajes/test.html.erb):

<% form_tag '/posts/do_test' do %> 
    <%=label_tag 'name' %> 
    <%=text_field_tag 'name'%> 

    <%=label_tag 'phone' %> 
    <%=text_field_tag 'phone'%> 

    <div><%= submit_tag 'Save' %></div> 
<% end -%> 

En el controlador de mensajes:

def test 
end 

def do_test 
    name = params[:name] 
    phone = params[:phone] 
    # do whatever you want... 
end 

También es necesario agregar estas 2 acciones a las rutas en config/routes.rb

map.resources :posts, :collection=>{:test => :get, :do_test => :post} 
+0

se ve bien, voy a probar esto ... – conspirisi

5

Si crea una clase para representar a su objeto (Digamos que es ContactInfo) se pueden definir los métodos de esa clase, a continuación, utilícelos usando los ayudantes estándar del constructor de la forma de los carriles.

class ContactInfo 
    attr_accessor :name, :company, :email, :phone, :comments 

    def initialize(hsh = {}) 
    hsh.each do |key, value| 
     self.send(:"#{key}=", value) 
    end 
    end 
end 

Y en su formulario:

<h2>Contact Us</h2> 
<% form_for(@contact_info, :url => path_for_your_controller_that_handles_this, :html => {:method => :post}) do |f| %> 

    <%= f.label :name %> 
    <%= f.text_field :name %> 

    ... 
<% end %> 

Hasta el momento, a quién le importa ¿verdad?

Sin embargo, agregue el validatable gem, y usted tiene un verdadero motivo para hacer esto! Ahora puede tener mensajes de validación como un modelo real.

Salida mi clase ContactInfo completado:

class ContactInfo 
    include Validatable 

    attr_accessor :name, :company, :email, :phone, :comments 

    validates_presence_of :name 
    validates_presence_of :email 
    validates_presence_of :phone 

    def initialize(hsh = {}) 
    hsh.each do |key, value| 
     self.send(:"#{key}=", value) 
    end 
    end 
end 

me gusta esto porque se puede escribir el controlador de mucho misma forma que un objeto ActiveRecord y no tener que muss para arriba con una gran cantidad de lógica para cuando se necesita para volver a mostrar el formulario.

Además, si está utilizando Formtastic u otro generador de formularios personalizado, puede usar este objeto con él, manteniendo fácilmente sus estilos de formulario existentes.

+0

gracias, lo veré, en algún momento pronto ... – conspirisi

Cuestiones relacionadas