2011-08-25 18 views
6

के लिए फ़ॉर्म बनाना संभव है, मैं सिर्फ क्लास गुणों को संपादित करने की क्षमता चाहता हूं, जो ActiveRecord क्लास के उत्तराधिकारी नहीं हैं।क्या सरल वर्ग

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 %> 

मुझे मिल गया

यहाँ मेरी कक्षा /app/model/entry.rb है जब मैं प्रपत्र खोल रहा था तो त्रुटि संदेश:

अपरिभाषित विधि `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 -tag का उपयोग कर वर्ग गुणों को संपादित करने की क्षमता है: कक्षा

यहाँ पूर्ण ढेर है?

+0

हो सकता है कि वहाँ कुछ और त्रुटि जानकारी है? त्रुटि संख्या के लिए कुछ और संदर्भ जैसे लाइन नंबर, फ़ाइल नाम इत्यादि – Zabba

+0

क्षमा करें, यह मेरी गलती है। यहां लाइन नंबर और पूर्ण स्टैक है http://pastebin.com/ECTEBNYq – demas

+0

यदि आप अपनी 'एंट्री' कक्षा में क्लास विधि 'model_name' को लागू करते हैं तो यह काम करेगा। 'form_for' एक ActiveRecord ऑब्जेक्ट की अपेक्षा करता है, जिसने क्लास विधि कहा है। हालांकि, कोई गारंटी नहीं है, पृष्ठभूमि में शायद कई अन्य चीजें चल रही हैं। – Mischa

उत्तर

5

jdc ने इसका उत्तर दिया, लेकिन आपने अनुरोध किए गए वास्तविक कार्यान्वयन को नहीं दिखाया। जैसा कि जेडीसी ने कहा है कि आपको कुछ ActiveModel मॉड्यूल शामिल करने की आवश्यकता है, जो आपकी रूबी क्लास को आपकी आवश्यक सुविधाएं प्रदान करेंगे।

ऐसा लगता है कि आपको ActiveModel :: नामकरण और ActiveModel :: विशेषताएँ विधियों की आवश्यकता है।

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

पहली पंक्ति आप model_name दे देंगे और दूसरी पंक्ति अपने मॉडल प्रपत्र सहायकों के साथ कार्य करने के लिए अनुमति देते हैं। अन्य लाइनें जिनका आप उपयोग कर सकते हैं: 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

इस ब्लॉग प्रविष्टि आप मिल शुरू कर दिया जाना चाहिए:

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

आप मॉड्यूल ActiveRecord का उपयोग करता है के कुछ शामिल कर सकते हैं सत्यापन और क्रमबद्धता जैसी चीजें प्राप्त करें। फिर, यदि आप कुछ "सहेजने" विधि की तरह कुछ चाहते हैं जो डेटाबेस पर नहीं जाता है, तो बस एक बनाएं। मैंने एक संपर्क मॉडल के लिए ऐसा किया था। यह एआर नहीं है, केवल एक सादे पुरानी रूबी ऑब्जेक्ट जो सत्यापन के लिए कुछ एक्टिवोडेल सामान में खींचती है, कुछ आवश्यक विधियां प्रदान करती है, तो सहेजने की विधि सिर्फ ई-मेल को आग लगती है। मुझे लगता है कि एक मिश्रण भी है जिसका उपयोग आप उस प्रारंभिक सामग्री की देखभाल करने के लिए कर सकते हैं जो मैं सृजन पर बड़े पैमाने पर असाइनमेंट की अनुमति देने के लिए कर रहा हूं, लेकिन मैंने इसे बारीकी से नहीं देखा है। यह ऑब्जेक्ट एआर ऑब्जेक्ट की तरह सामने के अंत में दिखता है, इसलिए मूल सहायक सभी काम करते हैं।

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 के जवाब देने के लिए कक्षा का विस्तार कर सकते हैं। यहाँ ActiveModel :: नामकरण में कोड है कि MODEL_NAME कहता है:

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 

मैं कॉल निम्नलिखित जारी रख सकता है, लेकिन मैं सलाह देते हैं कि आप इसे अपने आप को का पालन करें। आखिरकार आपको एक ऐसा कॉल मिलेगा जो विशेषताएँ और मानों का हैश देता है जो फॉर्म बिल्डर फॉर्म_for में उपयोग करता है।

बस रेल स्रोत देखें, देखें कि आपका कोड एक त्रुटि कहां फेंकता है, और उचित कॉल का जवाब देने के लिए अपनी कक्षा का विस्तार करें। इसे जारी रखें और आपका मॉडल ठीक जवाब देगा। एक्टिव्रेकॉर्ड मॉडल की तरह देखने, चलने और ध्वनि करने के लिए आपको सक्रिय सक्रिय मॉडल होने की आवश्यकता नहीं है।

0

मुझे यह RailsCasts Episode#193 मिला जो आप करने की कोशिश कर रहे हैं उसके साथ बहुत उपयोगी हो।

+0

निश्चित रूप से उपयोगी लेकिन केवल रेल के लिए 2. डेमा रेल 3 का उपयोग कर रहा है, उसे इसके बजाय ActiveModel शामिल करना चाहिए। http://railscasts.com/episodes/219-active-model –

संबंधित मुद्दे