2011-08-25 5 views
6

ActiveRecordクラスの後継ではないクラスプロパティを編集したいだけです。ここで単純なクラスのフォームを作成することは可能ですか

は私のクラスの/app/model/entry.rbである:ここで

class Entry 
    attr_accessor :title, :body 
end 

はコントローラである:ここでは

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

は図である。

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

私が得ましたフォームを開いている間のエラーメッセージ:

エントリのための未定義のメソッド `MODEL_NAMEは、」:クラス

ここ

がフルスタックである:

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' 

form_for - タグを使用して、クラスのプロパティを編集する機能ですか?

+0

たぶん、いくつかのより多くのエラー情報はありますか?行番号、ファイル名などのエラーのコンテキスト。 – Zabba

+0

申し訳ありませんが、私の間違いです。ここに行番号と完全なスタックhttp://pastebin.com/ECTEBNYq – demas

+0

'Entry'クラスにクラスメソッド' model_name'を実装するとうまくいくかもしれません。 'form_for'は、クラスメソッドを持つActiveRecordオブジェクトを想定しています。しかし、保証はありません、おそらくバックグラウンドで起こっている他の多くのものがあります。 – Mischa

答えて

5

jdcがこれに回答しましたが、あなたがリクエストした実際の実装は表示されませんでした。 jdcが述べたように、いくつかのActiveModelモジュールを組み込む必要があります。これにより、Rubyクラスに必要な機能が提供されます。

ActiveModel :: NamingとActiveModel :: AttributeMethodsが必要なようです。

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

最初の行は、あなたを与えるだろうmodel_nameと2行目では、あなたのモデルがフォームヘルパーで機能することができます。あなたが使うことができる他の行があります:jdcの答えにリンクされているブログ、またはRails APIをチェックしてください。詳細情報を

その他のリンク:

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

railscasts.comのリンクは完璧です。 –

0

一つにはあなたのエントリーモデルファイルは次のように起動する必要があります:

class Entry < ActiveRecord::Base 
+0

いいえ、それはこの質問のすべてについてです! ' Mischa

+0

ああ、残念です。 – allesklar

2

このブログのエントリは、あなたが始める必要があります:あなたはActiveRecordのは、に使用するモジュールの一部を含めることができ

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

検証やシリアライゼーションのようなものを得る。次に、データベースに移動しない「保存」メソッドなどが必要な場合は、作成するだけです。私は接触モデルのためにそれをしました。これはARではなく、いくつかの必要なメソッドを提供するいくつかのActiveModelのものを取り込んで、単にsaveメソッドが電子メールを起動する単純な古いルビーオブジェクトです。私は創造の質量割り当てを許可するためにやっている初期設定のものを世話するためにあなたが使うことができるミックスインがあると思うが、私はそれを詳しく調べていない。このオブジェクトはフロントエンドのARオブジェクトのように見えるので、基本ヘルパーはすべて動作します。

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

エラー、あなたが得ることがform_helper.rbに次の行からであるように見えます:あなたがハードコードした場合

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

:=>「エントリ」として、あなたは遠く少しを取得します。または、model_nameメソッドに応答するようにクラスを拡張することもできます。ここでMODEL_NAME呼び出すActiveModel ::ネーミングのコードです:私は、呼び出しを以下続けることができる

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 

は、私はあなたがそれを自分に従ってくださいお勧めします。最終的にフォームビルダーがform_forで使用する属性と値のハッシュを返す呼び出しが見つかります。

あなたのコードがどこにエラーを投げたかを見て、適切な呼び出しに応答するようにクラスを拡張してください。それをやり続けるとあなたのモデルはうまく対応します。あなたはアクティブレコードモデルのように見て、歩き、聞こえるアクティブレコードモデルである必要はありません。

0

私はこのRailsCasts Episode#193があなたがしようとしていることに非常に役立つことがわかりました。

+0

もちろん便利ですが、Rails 2専用です。デモはRails 3を使用しているので、代わりにActiveModelを組み込む必要があります。 http://railscasts.com/episodes/219-active-model –

関連する問題