2012-08-14 13 views
18

मैं तारों को संसाधित करने के लिए कुछ तरीकों को लिखना चाहता हूं, और मेरे कई नियंत्रकों में होने वाले अन्य कार्यों को लिखना चाहता हूं। मैं अपने नियंत्रक में हेल्पर्स को शामिल करने के लिए अपने बुरे अभ्यास को जानता हूं, इसलिए मैं बस सोच रहा था, नियंत्रकों में उपयोग की जाने वाली एप्लिकेशन विधियों को रखने के लिए सबसे अच्छी जगह कहां है?केवल नियंत्रकों के लिए सहायक तरीके कहां रखा जाए?

मुझे एहसास है कि आप में से कुछ उन्हें मॉडल में डालने के लिए कहेंगे, लेकिन आपको यह महसूस करना होगा कि मेरे सभी नियंत्रकों के पास एक संबद्ध मॉडल नहीं है। किसी भी और सभी इनपुट की सराहना की जाएगी।

उत्तर

10

यदि आपको एप्लिकेशन स्कोप में कोई विधि उपयोग करने की आवश्यकता है तो मैं सुझाव दूंगा कि आप उन विधियों को एप्लिकेशन नियंत्रक के अंदर रखें और उन्हें दृश्यों के अंदर उपयोग करने के लिए .. उन्हें सहायक तरीके के रूप में घोषित करें।

उदाहरण के लिए,

class ApplicationController < ActionController::Base 
helper_method :current_user, :some_method 

def current_user 
    @user ||= User.find_by_id(session[:user_id]) 
end 

def some_method 
end 
end 
+0

समस्या यह है कि यदि कई सहायक तरीके हैं, तो 'ApplicationController' अनावश्यक हो सकता है।सेमिन पेरेपेलित्सा के जवाब में सुझाए गए अनुसार, मैं श्रेणी द्वारा सहायक फ़ाइलों में विधियों को तोड़ना पसंद करता हूं, और 'एप्लिकेशन कंट्रोलर' में फ़ाइलों को भी शामिल करता हूं। –

0

मामले में उन तरीकों कई नियंत्रकों में उपयोग किया जाता है, मैं उन्हें application_controller.rb में परिभाषित करेगा। प्रत्येक नियंत्रक इसे प्राप्त करेगा और

11

परिभाषित किसी भी विधि का उपयोग करने में सक्षम होगा, मैं उन्हें मददगारों में डाल देता हूं। तथ्य यह है कि वे दृश्यों में शामिल हैं स्वचालित रूप से मेरे लिए कोई समस्या नहीं है। आप उन्हें में ऐप/चिंताओं/या lib/

पर भी निजी स्थान के साथ एप्लिकेशन कंट्रोलर को अव्यवस्थित करना पसंद नहीं करते क्योंकि यह अक्सर गड़बड़ हो जाता है।

उदाहरण:

module AuthenticationHelper 
    def current_user 
    @current_user # ||= ... 
    end 

    def authenticate! 
    redirect_to new_session_url unless current_user.signed_in? 
    end 
end 

module MobileSubdomain 
    def self.included(controller) 
    controller.before_filter :set_mobile_format 
    end 

    def set_mobile_format 
    request.format = :mobile if request.subdomain == "m" 
    end 
end 

class ApplicationController 
    include AuthenticationHelper 
    include MobileSubdomain 
end 
+0

मैं भी यही करता हूं। –

+0

यह एप्लिकेशन नियंत्रक में प्रत्येक सहायक विधि को भरने से मुझे अधिक समझ में आता है। – dscher

5

मैं उन्हें lib फ़ोल्डर में डाल करने के लिए सुझाव है। उदाहरण के लिए मेरे पास है:

lib/utils/string_utils 

module StringUtils 

    def foo 
    ... 
    end 
end 

class BarController < ActionController::Base 
    include StringUtils 
end 

यह अच्छा कहा जाता फैट मॉडल, पतला नियंत्रक कार्यप्रणाली, इस मामले में हम तर्क अलग करने के लिए मॉडल के बजाय mixins उपयोग कर रहे हैं लेकिन यह विचार ही है दर्शाता है। आप अपने नियंत्रकों को यथासंभव सरल बनाना चाहते हैं।

2

यह सब आपकी आवश्यकताओं पर निर्भर करता है। मैं यहां 2 उदाहरण प्रदान करूंगा। उनमें से दोनों केवल एक कस्टम पुस्तकालय हैं, lib निर्देशिका के तहत स्थित हैं।

पहले उदाहरण - "कस्टम स्ट्रिंग प्रसंस्करण"

# lib/filters.rb 
module Filters 

    # Converts value to canonical view 
    def self.phone(value) 
    # remove all non-digits 
    clean_value = value.gsub(/\D/, '') 

    country_codes = configus.phone.country_codes 
    area_code = configus.phone.defaults.area_code 

    case clean_value.length 
     when 7 
     "#{area_code}#{clean_value}" 
     when 11 
     # remove country code only if phone starts with the allowed country code 
     if country_codes.include?(clean_value[0].to_i) 
      clean_value[1..-1] 
     else 
      clean_value 
     end 
     else clean_value 
    end 
    end 

# usage 
# app/api/phones_controller.rb 
class Api::PhonesController < Api::ApplicationController 

    def exists 
    if params[:q] 
     clean_value = Filters.phone(params[:q]) 
     ... 
    end 
    end 
end 

दूसरा उदाहरण - फ्लैश संदेशों के लिए सहायक

# lib/flash_helper.rb 
module FlashHelper 
    def flash_translate(key, options = {}) 
    scope = [:flash, :controllers] 
    scope += params[:controller].split('/') 
    scope << params[:action] 

    t(key, {:scope => scope}.merge(options)) 
    end 
end 

# app/application_controller.rb 
class ApplicationController < ActionController::Base 
    include FlashHelper 
end 

# usage 
# app/your_controller.rb 
class YourController < ApplicationController 

    def create 
    @object = Object.new(params[:object]) 

    if @object.save 
     flash[:success] = flash_translate(:success) 
     ... 
    end 
    end 
end 

नोट: मत भूलना lib dir autoload पथ में जोड़ने के लिए । config/application.rb में इस लाइन को जोड़ें/संशोधित करें config.autoload_paths += %W(#{config.root}/lib)। तो मेरे लिए जवाब lib निर्देशिका है।

0

रेल 4 से शुरू करना app/controllers/concerns के लिए एक समर्पित फ़ोल्डर है। तो आप वहां एक मॉड्यूल बना सकते हैं और उसके बाद इसे एक विशिष्ट नियंत्रक (या) में एप्लिकेशन कंट्रोलर में शामिल कर सकते हैं यदि आपको इसे अपने सभी नियंत्रकों में उपलब्ध कराने की आवश्यकता है।

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