2012-02-19 7 views
6

मुझे अपने रेल 3.2 ऐप में कोई समस्या है जहां JSON के माध्यम से एक वर्चुअल विशेषता को तुरंत भेज दिया गया है, जो पैरा हैश में सही जगह पर नहीं है। खैर, यह वह जगह नहीं है जहां मैं उम्मीद करता हूं। यह देखना बाकी है कि मेरी अपेक्षाएं सही हैं या नहीं। :)आभासी विशेषता पैराम के अंदर मॉडल हैश में स्थानांतरित नहीं हुई

मैं एक मॉडल मानक आभासी विशेषता पद्धति का उपयोग कर, इस तरह है:

class Track < ActiveRecord::Base 
    def rating 
    # get logic removed for brevity 
    end 

    def rating=(value) 
    # set logic 
    end 

    def as_json(options={}) # so my method is in the JSON when I use respond_with/to_json 
    super(options.merge(methods: [:rating])) 
    end 
end 

JSON मेरी नियंत्रक के लिए भेजा इस तरह दिखता है:

{"id":1,"name":"Icarus - Main Theme 2","rating":2} 

स्पष्ट है कि, नाम और आईडी वर्चुअल नहीं है, रेटिंग है।

मैं पैरामीटर हैश में इस के साथ खत्म, रेल के बाद अपना जादू करता है:

{"id"=>"1", "name"=>"Icarus - Main Theme 2", "rating"=>2, "track"=>{"id"=>"1", "name"=>"Icarus - Main Theme 2"}} 

आप देख सकते हैं, आईडी और नाम यह नेस्ट करने के लिए करते हैं: ट्रैक हैश, लेकिन रेटिंग नहीं करता है। क्या यह अपेक्षित व्यवहार है? यह नियंत्रक में नेस्टेड हैश का उपयोग करने के (कुछ हद तक) मानक अभ्यास को तोड़ता है क्योंकि नेस्टेड हैश में मुझे आवश्यक सभी पैरामीटर नहीं होते हैं।

Track.update(params[:id], params[:track]) # :track is missing rating 

आपकी मदद के लिए धन्यवाद!

+0

क्या आप सबमिशन बनाने वाले फॉर्म को पेस्ट कर सकते हैं, ऐसा लगता है कि – MatthewFord

उत्तर

7

मैं हाल ही में इस गोचा में भी भाग गया। समस्या यह है कि पैराम रैपर आपके मॉडल Track.attribute_names को डेटा को मैप करने के तरीके को निर्धारित करने के लिए देख रहा है: track => {params} हैश। यदि आप एक मॉडल संबद्ध कर दिया है नहीं है, तो डिफ़ॉल्ट नियंत्रक के नाम के आधार पैरामीटर रैप करने के लिए होगा, और मूल्यों के सभी शामिल हैं: अपने नियंत्रक कार्रवाई नियंत्रक बताने के लिए में

class SinglesController < ApplicationController 
    def create 
    #params[:single] will contain all of your attributes as it doesn't 
    # have an activerecord model to look at. 
    @track_single = Track.new(params[:single]) 
    end 
end 

आप कॉल कर सकते हैं wrap_parameters क्या

class TracksController < ApplicationController 
    wrap_parameters :track, :include => :rating 
    #other controller stuff below 
end 

यहाँ अधिक देखें:: http://api.rubyonrails.org/classes/ActionController/ParamsWrapper.html

+3

को ट्रैक करने के लिए इसे सही ढंग से स्कॉप्ड नहीं किया गया है, मुझे रैप_परैमीटर का उपयोग करते समय भी इसी तरह की समस्या है, अगर मेरे पास कई अन्य गैर-वर्चुअल विशेषताएं हैं, तो मुझे लिखना पड़ा उनमें से सभी सरणी शामिल करने के लिए। अन्यथा वे अनुरोध हैश में शामिल नहीं होंगे, इसे सरल तरीके से कैसे करें? चूंकि मेरे पास सिर्फ एक वर्चुअल विशेषता है जिसे मैं हैश अनुरोध में शामिल करना चाहता हूं? धन्यवाद – user1883793

0

हो सकता है कि अगर आप इस तरह नेस्टेड हैश अंदर rating आभासी विशेषता आवंटित:

def as_json(options={}) 
    super(options.merge(:track => {:methods => @rating})) 
end 

यह जिस तरह से आप उम्मीद कैसा व्यवहार करेंगे।

0

बस इस समस्या का सामना करना भाग गया और एक बहुत सभ्य समाधान पता लगा शामिल करने के लिए जब उसके अपने परम लपेटकर, इसलिए तरह जिम्मेदार बताते हैं। जोड़ें अपने ApplicationController

wrap_parameters exclude: [:controller, :action, :format] + ActionController::ParamsWrapper::EXCLUDE_PARAMETERS 

इस तरह के लिए निम्न, सब कुछ अपने संसाधन के तहत नीडिंत है (सामान रेल के अलावा पैरामीटर हैश को जोड़ता है) और आप कभी भी फिर से wrap_parameters के एक नियंत्रक विशिष्ट कॉल करने के लिए संलग्न करने के लिए नहीं करना होगा । : डी