2011-08-25 8 views
6

? Solo quiero tener la capacidad de editar las propiedades de clase que no es el sucesor de la clase ActiveRecord.¿Es posible crear formulario para la clase simple

Aquí es mi /app/model/entry.rb clase:

class Entry 
    attr_accessor :title, :body 
end 

Aquí es un controlador:

class DiaryController < ApplicationController 
    def new 
    @entry = Entry.new 
    end 
end 

Ésta es una vista:

<%= form_for(@entry) do |f| %> 
<%= f.text_field :title %> <br /> 
<%= f.text_area :body %> <br /> 
<% end %> 

llegué el mensaje de error mientras abría el formulario:

método no definido `nombre_del_modelo' de entrada: Clase

Aquí es pila completa:

Extracted source (around line #1): 

1: <%= form_for(@entry) do |f| %> 
2: <%= f.text_field :title %> <br /> 
3: <%= f.text_area :body %> <br /> 
4: <% end %> 


Full trace: 

activemodel (3.0.6) lib/active_model/naming.rb:95:in `model_name_from_record_or_class' 
activemodel (3.0.6) lib/active_model/naming.rb:82:in `singular' 
actionpack (3.0.6) lib/action_view/helpers/form_helper.rb:312:in `form_for' 
app/views/diary/new.html.erb:1:in `_app_views_diary_new_html_erb___902027577_26033568_187052521' 
actionpack (3.0.6) lib/action_view/template.rb:135:in `block in render' 
activesupport (3.0.6) lib/active_support/notifications.rb:54:in `instrument' 
actionpack (3.0.6) lib/action_view/template.rb:127:in `render' 
actionpack (3.0.6) lib/action_view/render/rendering.rb:59:in `block in _render_template' 
activesupport (3.0.6) lib/active_support/notifications.rb:52:in `block in instrument' 
activesupport (3.0.6) lib/active_support/notifications/instrumenter.rb:21:in `instrument' 
activesupport (3.0.6) lib/active_support/notifications.rb:52:in `instrument' 
actionpack (3.0.6) lib/action_view/render/rendering.rb:56:in `_render_template' 
actionpack (3.0.6) lib/action_view/render/rendering.rb:26:in `render' 
actionpack (3.0.6) lib/abstract_controller/rendering.rb:115:in `_render_template' 
actionpack (3.0.6) lib/abstract_controller/rendering.rb:109:in `render_to_body' 
actionpack (3.0.6) lib/action_controller/metal/renderers.rb:47:in `render_to_body' 
actionpack (3.0.6) lib/action_controller/metal/compatibility.rb:55:in `render_to_body' 
actionpack (3.0.6) lib/abstract_controller/rendering.rb:102:in `render_to_string' 
actionpack (3.0.6) lib/abstract_controller/rendering.rb:93:in `render' 
actionpack (3.0.6) lib/action_controller/metal/rendering.rb:17:in `render' 
actionpack (3.0.6) lib/action_controller/metal/instrumentation.rb:40:in `block (2 levels) in render' 
activesupport (3.0.6) lib/active_support/core_ext/benchmark.rb:5:in `block in ms' 
c:/Ruby192/lib/ruby/1.9.1/benchmark.rb:309:in `realtime' 
activesupport (3.0.6) lib/active_support/core_ext/benchmark.rb:5:in `ms' 
actionpack (3.0.6) lib/action_controller/metal/instrumentation.rb:40:in `block in render' 
actionpack (3.0.6) lib/action_controller/metal/instrumentation.rb:78:in `cleanup_view_runtime' 
activerecord (3.0.6) lib/active_record/railties/controller_runtime.rb:15:in `cleanup_view_runtime' 
actionpack (3.0.6) lib/action_controller/metal/instrumentation.rb:39:in `render' 
actionpack (3.0.6) lib/action_controller/metal/implicit_render.rb:10:in `default_render' 
actionpack (3.0.6) lib/action_controller/metal/implicit_render.rb:5:in `send_action' 
actionpack (3.0.6) lib/abstract_controller/base.rb:150:in `process_action' 
actionpack (3.0.6) lib/action_controller/metal/rendering.rb:11:in `process_action' 
actionpack (3.0.6) lib/abstract_controller/callbacks.rb:18:in `block in process_action' 
activesupport (3.0.6) lib/active_support/callbacks.rb:436:in `_run__776311234__process_action__123531476__callbacks' 
activesupport (3.0.6) lib/active_support/callbacks.rb:410:in `_run_process_action_callbacks' 
activesupport (3.0.6) lib/active_support/callbacks.rb:94:in `run_callbacks' 
actionpack (3.0.6) lib/abstract_controller/callbacks.rb:17:in `process_action' 
actionpack (3.0.6) lib/action_controller/metal/instrumentation.rb:30:in `block in process_action' 
activesupport (3.0.6) lib/active_support/notifications.rb:52:in `block in instrument' 
activesupport (3.0.6) lib/active_support/notifications/instrumenter.rb:21:in `instrument' 
activesupport (3.0.6) lib/active_support/notifications.rb:52:in `instrument' 
actionpack (3.0.6) lib/action_controller/metal/instrumentation.rb:29:in `process_action' 
actionpack (3.0.6) lib/action_controller/metal/rescue.rb:17:in `process_action' 
actionpack (3.0.6) lib/abstract_controller/base.rb:119:in `process' 
actionpack (3.0.6) lib/abstract_controller/rendering.rb:41:in `process' 
actionpack (3.0.6) lib/action_controller/metal.rb:138:in `dispatch' 
actionpack (3.0.6) lib/action_controller/metal/rack_delegation.rb:14:in `dispatch' 
actionpack (3.0.6) lib/action_controller/metal.rb:178:in `block in action' 
actionpack (3.0.6) lib/action_dispatch/routing/route_set.rb:62:in `call' 
actionpack (3.0.6) lib/action_dispatch/routing/route_set.rb:62:in `dispatch' 
actionpack (3.0.6) lib/action_dispatch/routing/route_set.rb:27:in `call' 
rack-mount (0.6.14) lib/rack/mount/route_set.rb:148:in `block in call' 
rack-mount (0.6.14) lib/rack/mount/code_generation.rb:93:in `block in recognize' 
rack-mount (0.6.14) lib/rack/mount/code_generation.rb:68:in `optimized_each' 
rack-mount (0.6.14) lib/rack/mount/code_generation.rb:92:in `recognize' 
rack-mount (0.6.14) lib/rack/mount/route_set.rb:139:in `call' 
actionpack (3.0.6) lib/action_dispatch/routing/route_set.rb:493:in `call' 
actionpack (3.0.6) lib/action_dispatch/middleware/best_standards_support.rb:17:in `call' 
actionpack (3.0.6) lib/action_dispatch/middleware/head.rb:14:in `call' 
rack (1.2.2) lib/rack/methodoverride.rb:24:in `call' 
actionpack (3.0.6) lib/action_dispatch/middleware/params_parser.rb:21:in `call' 
actionpack (3.0.6) lib/action_dispatch/middleware/flash.rb:182:in `call' 
actionpack (3.0.6) lib/action_dispatch/middleware/session/abstract_store.rb:149:in `call' 
actionpack (3.0.6) lib/action_dispatch/middleware/cookies.rb:302:in `call' 
activerecord (3.0.6) lib/active_record/query_cache.rb:32:in `block in call' 
activerecord (3.0.6) lib/active_record/connection_adapters/abstract/query_cache.rb:28:in `cache' 
activerecord (3.0.6) lib/active_record/query_cache.rb:12:in `cache' 
activerecord (3.0.6) lib/active_record/query_cache.rb:31:in `call' 
activerecord (3.0.6) lib/active_record/connection_adapters/abstract/connection_pool.rb:354:in `call' 
actionpack (3.0.6) lib/action_dispatch/middleware/callbacks.rb:46:in `block in call' 
activesupport (3.0.6) lib/active_support/callbacks.rb:416:in `_run_call_callbacks' 
actionpack (3.0.6) lib/action_dispatch/middleware/callbacks.rb:44:in `call' 
rack (1.2.2) lib/rack/sendfile.rb:107:in `call' 
actionpack (3.0.6) lib/action_dispatch/middleware/remote_ip.rb:48:in `call' 
actionpack (3.0.6) lib/action_dispatch/middleware/show_exceptions.rb:47:in `call' 
railties (3.0.6) lib/rails/rack/logger.rb:13:in `call' 
rack (1.2.2) lib/rack/runtime.rb:17:in `call' 
activesupport (3.0.6) lib/active_support/cache/strategy/local_cache.rb:72:in `call' 
rack (1.2.2) lib/rack/lock.rb:11:in `block in call' 
<internal:prelude>:10:in `synchronize' 
rack (1.2.2) lib/rack/lock.rb:11:in `call' 
actionpack (3.0.6) lib/action_dispatch/middleware/static.rb:30:in `call' 
railties (3.0.6) lib/rails/application.rb:168:in `call' 
railties (3.0.6) lib/rails/application.rb:77:in `method_missing' 
railties (3.0.6) lib/rails/rack/log_tailer.rb:14:in `call' 
rack (1.2.2) lib/rack/content_length.rb:13:in `call' 
rack (1.2.2) lib/rack/handler/webrick.rb:52:in `service' 
c:/Ruby192/lib/ruby/1.9.1/webrick/httpserver.rb:111:in `service' 
c:/Ruby192/lib/ruby/1.9.1/webrick/httpserver.rb:70:in `run' 
c:/Ruby192/lib/ruby/1.9.1/webrick/server.rb:183:in `block in start_thread' 

es la posibilidad de editar las propiedades de clase utilizando el -tag form_for?

+0

tal vez hay algo más de información de error? Un poco más de contexto para el error, como el número de línea, el nombre del archivo, etc. – Zabba

+0

Lo siento, es un error mío. Aquí está el número de línea y la pila completa http://pastebin.com/ECTEBNYq – demas

+0

Tal vez funcione si implementa el método de clase 'model_name' en su clase' Entry'. 'form_for' espera un objeto ActiveRecord, que tiene dicho método de clase. Sin embargo, no hay garantías, probablemente haya muchas otras cosas sucediendo en el fondo. – Mischa

Respuesta

5

jdc respondió esto, pero no mostró la implementación real que solicitó. Como jdc dijo, necesitas incluir algunos módulos de ActiveModel, que le darán a tu clase ruby ​​las características que necesitas.

Parece que necesita ActiveModel :: Naming y ActiveModel :: AttributeMethods.

class Entry 
    extend ActiveModel::Naming 
    include ActiveModel::AttributeMethods 
end 

La primera línea le dará model_name y la segunda línea permitirá a su modelo funcione con los ayudantes de formulario. Hay otras líneas que puede usar: consulte el blog publicado vinculado en la respuesta de jdc o el Rails API.

Más enlaces con información detallada:

http://www.rubyinside.com/rails-3-0s-activemodel-how-to-give-ruby-classes-some-activerecord-magic-2937.html

http://railscasts.com/episodes/219-active-model

+0

El enlace de railscasts.com es perfecto. –

0

Por un lado el archivo de modelo de entrada debe empezar así:

class Entry < ActiveRecord::Base 
+0

¡No, de eso se trata esta pregunta! Para que funcione sin ' Mischa

+0

Ah, perdón por eso. – allesklar

2

Esta entrada de blog debería empezar:

http://yehudakatz.com/2010/01/10/activemodel-make-any-ruby-object-feel-like-activerecord/

Puede incluir algunos de los módulos de ActiveRecord utiliza para obtener cosas como validación y serialización. Luego, si desea algo como un método de "guardar" que no vaya a la base de datos, simplemente cree uno. Lo hice por un modelo de contacto. No es AR, simplemente es un simple objeto de rubí antiguo que extrae algunos elementos de ActiveModel para la validación, proporciona algunos métodos necesarios, luego el método de guardar simplemente dispara un correo electrónico. Creo que incluso hay una mezcla que puedes utilizar para encargarse de las cosas de inicialización que estoy haciendo para permitir la asignación masiva en la creación, pero no la he examinado tan de cerca. Este objeto se ve como un objeto AR en la parte frontal, por lo que todos los ayudantes básicos funcionan.

class Contact 
    include ActiveModel::Validations 

    attr_accessor :id, :name, :email, :subject, :body 

    validates :name, :presence => true 
    validates :email, :presence => true 
    validates :subject, :presence => true 
    validates :body, :presence => true 

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

    def read_attribute_for_validation(key) 
    @attributes[key] 
    end 

    def to_key 
    end 

    def save 
    if self.valid? 
     ContactNotifier.website_contact(self).deliver 
     return true 
    end 
    false 
    end 
end 
0

Parece que el error es su conseguir de la siguiente línea en el form_helper.rb:

object_name = options[:as] || ActiveModel::Naming.param_key(object) 

Si hardcode en: as => "Entrada", obtendrá un poco más lejos . O bien, podría extender la clase para responder al método model_name. Aquí está el código en ActiveModel :: nombres que llama nombre_del_modelo:

def self.model_name_from_record_or_class(record_or_class) 
     (record_or_class.is_a?(Class) ? record_or_class : convert_to_model(record_or_class).class).model_name 
     end 

podría continuar después de las llamadas, pero recomiendo que siga usted mismo. Finalmente, encontrará una llamada que devuelve un hash de atributos y valores que el creador de formularios usa en form_for.

Basta con mirar a través de la fuente de los rieles, ver dónde su código arroja un error, y ampliar su clase para responder a la llamada correcta. Sigue haciéndolo y tu modelo responderá bien. No necesita ser un modelo de registro activo para mirar, caminar y sonar como un modelo de registro activo.

0

Encontré este RailsCasts Episode#193 para ser muy útil con lo que estás tratando de hacer.

+0

Ciertamente útil pero solo para Rails 2. demas está usando Rails 3, debería incluir ActiveModel en su lugar. http://railscasts.com/episodes/219-active-model –

Cuestiones relacionadas