किसी क्षेत्र को परम से कैसे निकालें [: ​​कुछ]


116

मेरा पंजीकरण फॉर्म, जो उपयोगकर्ता मॉडल का एक रूप है, कंपनी के लिए एक स्ट्रिंग मान लेता है। हालाँकि, मैंने सिर्फ एक बदलाव किया है, जो कि users_to कंपनियों का है। इसलिए, मुझे उपयोगकर्ता मॉडल के लिए कंपनी का एक ऑब्जेक्ट पास करना होगा।

मैं कंपनी का एक ऑब्जेक्ट प्राप्त करने के लिए फॉर्म से स्ट्रिंग मान का उपयोग करना चाहता हूं:

@user.company = Company.find_by_name(params[:company])

मेरा मानना ​​है कि उपरोक्त काम करता है, हालांकि जब मैं कॉल करता हूं तो फॉर्म: कंपनी (जो स्ट्रिंग) मॉडल में गुजर रहा है:

@user = User.new(params[:user])

इसलिए, मैं यह जानना चाहता हूं (और यह पता नहीं लगा सकता) कि उपयोगकर्ता मॉडल को पास करने से पहले: कंपनी को कैसे हटाया जाए।

जवाबों:


209

संपादित जवाब - 4/5 रेल (टिप्पणी देखें)

चूंकि यह प्रश्न लिखा गया था, रेल के नए संस्करणों ने अर्क को जोड़ा है ! और उदाहरण के अलावा :

new_params = params.except[the one I wish to remove]

यह उन सभी पैरामियों को 'हड़पने ’के लिए एक सुरक्षित तरीका है, जिनकी आपको एक प्रति की आवश्यकता होती है, जो पैरामेट्स में उत्तीर्ण मूल को नष्ट किए बिना होती है (जो समय के साथ आपके कोड के डिबगिंग और रखरखाव को बहुत मुश्किल बना देगा) यह अच्छी बात नहीं है।

या आप बिना कॉपी किए सीधे पास हो सकते हैं जैसे:

@person.update(params[:person].except(:admin))

extract!(! धमाके ऑपरेटर है) ताकि अधिक देखभाल के साथ प्रयोग के मूल को संशोधित करेगा!

मूल उत्तर

आप एक हैश का उपयोग करके एक कुंजी / मान जोड़ी निकाल सकते हैं Hash#delete:

params.delete :company

यदि यह परमों [: उपयोगकर्ता] में समाहित है, तो आप इसका उपयोग करेंगे:

params[:user].delete :company

16
मैं रेल 4.0 का उपयोग कर रहा हूं, और model_params.delete :key_nameकाम नहीं करता - कोई विचार क्यों?
जोरायर

13
परम हैश से हटाना एक बहुत ही बुरा विचार है। डिबगिंग आदि के दौरान लोगों को आसानी से भ्रमित करता है ... एक कस्टम हैश का उपयोग करें जिसे आप विशेषता निर्दिष्ट करने के लिए पास करते हैं, उदाहरण के लिए उपयोग करें assin_params = params.dup.delete(:company)। कभी भी सीधे
परमेस

4
मेरा मतलब थाassign_params = params.dup; assign_params.delete(:company)
डोमिनिक गोल्टरमैन

12
@Zorayr मेरे पास एक ही मुद्दा था। मेरे लिए यह इसलिए था क्योंकि मेरा model_paramsकार्य एक समारोह था, जिसने प्रासंगिक पारमों को खींच लिया params। तो जब आप deleteसे model_paramsआप वास्तव में सिर्फ हैश से हटा रहे हैं कि model_paramsवापस आता है।
लुसी बैन

1
user_params एक विधि है, इसलिए जब आप user_params.delete (: this_param) करते हैं, तो यह सही हैश की गणना करता है, लेकिन user_params के लिए किसी भी बाद में कॉल हैश को खरोंच से फिर से जोड़ देगा। यही कारण है कि @ गॉल ने कहा कि यह एक बुरा विचार है। रेल 5 में अब आपके पास params.except विधि है और अर्क भी है!
rmcsharry

89

आपको संभवतः हैश.सेक्स का उपयोग करना चाहिए

class MyController < ApplicationController
  def explore_session_params
    params[:explore_session].except(:account_id, :creator)
  end
end

यह 2 चीजों को पूरा करता है: आपको एक बार में 1 से अधिक कुंजी को बाहर करने की अनुमति देता है, और मूल हैश को संशोधित नहीं करता है।


रेल्स 4 एक्शनकंट्रोलर :: पैराथर्स विरासत में मिले हैं, इसलिए सिवाय या निकालने के! काम करेगा, रेल 5 में, इसके अलावा और निकालने के लिए! एक्शनकंट्रोलर में परिभाषित तरीके :: पैरामीटर्स खुद
kangkyu

मेरे पास वास्तव में UPDATE विधि में यह हैश परमेस है। जिनके पास "-1"कुंजी है, उन्हें छोड़कर मैं कैसे कर सकता हूं । {"utf8" => "✓", "_मिथोड" => "पैच", "प्रमाणिकता_तोकेन" => "वीटीवाई ...", "विवरणिका" => {"शीर्षक" =>> "नमस्ते दुनिया", "profilings_attributes" => {"-1" => {"मेंबर_प्रोफाइल_ड" => "3"}, "0" => "" प्रतिशत "=>" 10.0 "," वर्णन "=>" कुछ वर्णन! "," _Destroy "= > "गलत", "आईडी" => "10"}, "1" => {...}, "प्रायोजक_सेतुएं" => {"-1" => {"प्रायोजक_द" => "2"} "0" => { "brochure_id" => "

2

इसे प्राप्त करने का सही तरीका उपयोग है strong_params

class UsersController < ApplicationController
  def create
    @user = User.new(user_params)
  end

  private

  def user_params
    params.require(:user).permit(:name, :age)
  end
end

इस तरह से आपके पास अधिक नियंत्रण है, जिस पर मॉडल को पारित किया जाना चाहिए


1
respond_to do |format|
  if params[:company].present?
    format.html { redirect_to(:controller => :shopping, :action => :index) }
  else
    format.html
  end
end

यह parl को url से हटा देगा


0

मिटाने के लिए आप एक ज्ञापन कर सकते हैं :

def parameters
  @parameters ||= params.require(:root).permit(:foo, :bar)
end

अब आप कर सकते हैं:

parameteres.delete(:bar)
parameters
=> <ActionController::Parameters {"foo" => "foo"} permitted: true>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.