9

आप नियंत्रक से डेटा को मॉडल में कैसे पास करते हैं?आप रूबी ऑन रेल के साथ एक नियंत्रक से डेटा को मॉडल में कैसे पास करते हैं?

मेरी application_controller में मैं उपयोगकर्ता के स्थान (राज्य और शहर) हड़पने और एक before_filter यह सब मेरी नियंत्रकों में नहीं पहुंच बनाने के लिए के माध्यम से

before_filter :community 

def community 
    @city = request.location.city 
    @state = request.location.state 
    @community = @[email protected] 
    end 

तब मैं डाटा मॉडल के लिए नियंत्रक में लिया गया जोड़ने की कोशिश में शामिल के माध्यम से:

before_save :add_community 

def add_community 
     self.community = @community 
    end 

डेटा, हालांकि, कभी भी नियंत्रक से मॉडल तक अपना रास्ता नहीं बनाता है। अगर मैं का उपयोग करें:

def add_community 
    @city = request.location.city 
    @state = request.location.state 
    @community = @[email protected] 
    self.community = @community 
    end 

तरीकों request.location.city और request.location.state मॉडल से काम नहीं करते हैं। मुझे पता है कि बाकी सब कुछ काम कर रहा है क्योंकि अगर और @state स्ट्रिंग्स के रूप में def_community के तहत परिभाषित करता है, तो सब कुछ काम करता है, सिवाय इसके कि मेरे पास गतिशील चर नहीं है, केवल मॉडल में रखी गई एक स्ट्रिंग है। साथ ही, मुझे पता है कि अनुरोध नियंत्रक/विचारों में काम कर रहे हैं, क्योंकि मैं उन्हें उचित गतिशील जानकारी प्रदर्शित करने के लिए प्राप्त कर सकता हूं। मुद्दा बस नियंत्रक से डेटा को मॉडल में प्राप्त कर रहा है। अपने व़क्त के लिए बहुत - बहुत शुक्रिया।

+0

मैं तुम्हें इस सवाल का या अपने अन्य को नष्ट कर दें, क्योंकि वे मूलतः एक ही कर रहे हैं है। अगली बार, यदि आप चीजों को स्पष्ट करना चाहते हैं, तो आप बस अपना मूल प्रश्न संपादित कर सकते हैं: http://stackoverflow.com/questions/10236645/getting-methods-that-work-in-controller-views-to-function-in -ए-मॉडल-रूबी-ऑन-आर – tsherif

+0

स्टैक ओवरव्लो में आपका स्वागत है! उन सभी उत्तरों को ऊपर उठाना याद रखें जिन्हें आप उपयोगी पाते हैं, जिनमें दूसरों के प्रश्नों के उत्तर भी शामिल हैं। अपने प्रश्नों का सबसे अच्छा जवाब "चेक करें" (चुनें)। –

उत्तर

13

जिस अवधारणा के साथ आप कुश्ती कर रहे हैं वह MVC architecture है, जो जिम्मेदारियों को अलग करने के बारे में है। मॉडलों को डीबी (या अन्य बैकएंड) के साथ बातचीत को संभालने के बिना किसी संदर्भ के किसी भी ज्ञान की आवश्यकता के बिना बातचीत करना चाहिए (चाहे वह HTTP अनुरोध हो या अन्यथा), विचारों को बैकएंड और नियंत्रकों के बारे में जानने की आवश्यकता नहीं है दोनों के बीच बातचीत को संभालें।

तो आपके रेल ऐप के मामले में, विचारों और नियंत्रकों के पास request ऑब्जेक्ट तक पहुंच है, जबकि आपके मॉडल नहीं हैं। यदि आप अपने अनुरोध पर वर्तमान अनुरोध से जानकारी पास करना चाहते हैं, तो ऐसा करने के लिए यह आपके नियंत्रक पर निर्भर है।

class User < ActiveRecord::Base 

    def add_community(city, state) 
    self.community = city.to_s + state.to_s # to_s just in case you got nils 
    end 

end 

और फिर अपने नियंत्रक में:

class UsersController < ApplicationController 

    def create # I'm assuming it's create you're dealing with 
    ... 
    @user.add_community(request.location.city, request.location.state) 
    ... 
    end 
end 

मैं पसंद request वस्तु सीधे पारित करने के लिए नहीं है, क्योंकि वह वास्तव में वर्तमान से मॉडल की जुदाई का कहना है इस प्रकार मैं अपने add_community परिभाषित करेगा निवेदन। User मॉडल को request ऑब्जेक्ट्स या वे कैसे काम करते हैं, इसके बारे में जानने की आवश्यकता नहीं है। यह सब जानता है कि यह city और state प्राप्त कर रहा है।

उम्मीद है कि मदद करता है।

+3

+1 "to_s के लिए सिर्फ अगर आपको नाइल्स मिलते हैं" –

+1

सबकुछ अब काम करता है, धन्यवाद-बहुत कुछ: डी। – Laser

+1

@ लेज़र ग्लेड इसे सुनना :) हैप्पी कोडिंग! – tsherif

3

नियंत्रक में वर्ग आवृत्ति चर (जो @ से शुरू होते हैं) मॉडल में से अलग हैं। यह एमवीसी वास्तुकला में मॉडल बनाम नियंत्रक है। मॉडल और नियंत्रक (और देखें) अलग हो गए हैं।

आप एक नियंत्रक से जानकारी को स्पष्ट रूप से एक मॉडल में ले जाते हैं।

उपयोग समारोह पैरामीटर

# In the controller 
user = User.new(:community => @community) 

# In this example, :community is a database field/column of the 
# User model  

Docs

उपयोग उदाहरण चर विशेषता setters

# In the controller 
user = User.new 
user.community = @community 
# same as above, :community is a database field 

पास: रेल और अन्य वस्तु उन्मुख प्रणाली में, आपके पास कई विकल्प मॉडल के लिए डेटा ing जब डेटा नहीं एक डेटाबेस क्षेत्र

# In the model 
class User < ActiveRecord::Base 
    attr_accessor :community 
    # In this example, :community is NOT a database attribute of the  
    # User model. It is an instance variable that can be used 
    # by the model's calculations. It is not automatically stored in the db 

# In the controller -- Note, same as above -- the controller 
# doesn't know if the field is a database attribute or not. 
# (This is a good thing) 
user = User.new 
user.community = @community 

Docs