मैं रेल्स में एक ही फॉर्म के लिए कई सबमिट बटन कैसे बना सकता हूं?


97

मुझे कई सबमिट बटन होने चाहिए।

मेरे पास एक फॉर्म है जो Contact_Call का एक उदाहरण बनाता है।

एक बटन इसे सामान्य बनाता है।

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

मैं उसको कैसे करू? मैं मार्ग नहीं बदल सकता, इसलिए एक अलग चर भेजने का एक तरीका है जिसे [: params] द्वारा उठाया जाता है?

और अगर मैं ऐसा करता हूं, तो नियंत्रक में क्या करूं, एक केस स्टेटमेंट सेट करें?



3
यह एक पुराना है और इसके पास अधिक वोट हैं। यदि उपरोक्त में से कुछ भी इसे के डुप्लिकेट के रूप में बंद किया जाना चाहिए ...
टैरीन ईस्ट

जवाबों:


129

आप कई सबमिट बटन बना सकते हैं और प्रत्येक को एक अलग मूल्य प्रदान कर सकते हैं:

<% form_for(something) do |f| %>
    ..
    <%= f.submit 'A' %>
    <%= f.submit 'B' %>
    ..
<% end %>

यह आउटपुट होगा:

<input type="submit" value="A" id=".." name="commit" />
<input type="submit" value="B" id=".." name="commit" />

आपके नियंत्रक के अंदर, सबमिट किए गए बटन के मूल्य को पैरामीटर द्वारा पहचाना जाएगा commit। आवश्यक प्रसंस्करण करने के लिए मूल्य की जाँच करें:

def <controller action>
    if params[:commit] == 'A'
        # A was pressed 
    elsif params[:commit] == 'B'
        # B was pressed
    end
end

हालांकि, याद रखें कि यह कसकर नियंत्रक को आपका दृष्टिकोण बताता है जो बहुत वांछनीय नहीं हो सकता है।


1
अब कुछ नया है। धन्यवाद @ अनुराग!
श्रीपद कृष्णा

1
इसलिए बस 'ए' को स्वचालित रूप से पैरामीटर नाम = 'कमिट' बनाएं?
टिमोथी टी।

वहाँ एक तरीका है के रूप में आप कसकर नियंत्रक को देखने के जोड़े को नहीं कहा है? उदाहरण के लिए, URL बदलने के लिए सबमिट बटन के लिए? ऐसा लगता है कि यह आवश्यक रूप से बुरा नहीं है क्योंकि एक फॉर्म वेरिएबल्स को जमा करता है जो हेट कंट्रोलर, ई वेन के व्यवहार को बदल सकता है यदि यह उपयोगकर्ता इनपुट है, जो बटन का चयन है?
टिमोथी टी।

1
आप एक गड़बड़ एक्शन हैक के बिना एक फॉर्म एक्शन विशेषता को नहीं बदल सकते।
बेन ओरोज़्को

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

74

सबमिट बटन पर सूत्रीकरण विशेषता का उपयोग करते हुए एक और दृष्टिकोण भी है:

<% form_for(something) do |f| %>
    ...
    <%= f.submit "Create" %>
    <%= f.submit "Special Action", formaction: special_action_path %>
<% end %>

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

निरूपण:
एक प्रोग्राम का यूआरआई जो इनपुट तत्व द्वारा प्रस्तुत की गई जानकारी को संसाधित करता है, अगर वह सबमिट बटन या छवि है। यदि निर्दिष्ट किया गया है, तो यह तत्व के फॉर्म के मालिक की कार्रवाई विशेषता को ओवरराइड करता है । स्रोत: एमडीएन


2
यह सभी ब्राउज़रों में समर्थित है w3schools.com/tags/att_button_formaction.asp w3schools.com/tags/att_input_formaction.asp
सुमित गर्ग

8
मुझे एहसास है कि सवाल पुराना है, लेकिन मैं पाठकों को सलाह देता हूं कि यह संक्षिप्त समाधान बेहतर विचार का हकदार है।
जेरोम

2
काश मुझे यह उत्तर पहली बार मिलता तो यही सवाल था। मुझे खुशी है कि मैंने इस बार थोड़ी गहराई से देखने का फैसला किया। महान समाधान।
रॉकसबाकस

1
मुझे वास्तव में यह समाधान पसंद है। हालाँकि, मुझे CSRF टोकन के साथ एक छिपे हुए क्षेत्र को जोड़ना था, भले ही मैं पहले से ही फॉर्म हेल्पर्स का उपयोग कर रहा था या रेल टोकन स्वीकार नहीं करेगा। मुझे बेहतर वर्कअराउंड नहीं मिला और मुझे अभी भी यकीन नहीं है कि वास्तव में ऐसा क्यों होता है या सिर्फ टोकन जोड़ने से यह फिर से ठीक हो जाता है।
इरुपुतुनकु

मुझे लगता है कि यह बेहतर समाधान है क्योंकि यह एकल जिम्मेदारी सिद्धांतों का सम्मान करता है और चीजों को स्पष्ट रखता है प्रत्येक बटन नियंत्रक में तर्क को सरल रखते हुए अपनी कार्रवाई करता है।
खलील घरौई

29

आप वैकल्पिक रूप से मान्यता प्राप्त कर सकते हैं कि कौन सा बटन दबाया गया था ताकि इसका विशेषता नाम बदल जाए।

<% form_for(something) do |f| %>
    ..
    <%= f.submit 'A', name: 'a_button' %>
    <%= f.submit 'B', name: 'b_button' %>
    ..
<% end %>

यह थोड़ा असुविधाजनक है क्योंकि आपको केवल चेक params[:commit]वैल्यू की बजाय परम कीज की मौजूदगी की जांच करनी है: आपको प्राप्त होगा params[:a_button]या params[:b_button]जिसके आधार पर किसी को दबाया गया था।


2
फिर भी नियंत्रक से दृश्य को अपवित्र नहीं करता है।
धीमी गति

1
हां, यदि डिकूपल का अर्थ है कि आप सही कार्रवाई के लिए मार्गों के लिए कार्रवाई में कुछ तर्क से बच रहे हैं, तो वे अभी भी युग्मित हैं। मेरा बस यह मतलब था कि यदि आप उस तर्क में नाम विशेषता का उपयोग करते हैं तो आपका नियंत्रक बटन पर दिखाए गए से स्वतंत्र है। धन्यवाद, संपादित
masciugo

4
यह i18n स्थितियों में स्वीकृत एक से बेहतर प्रतीत होता है क्योंकि "मूल्य" प्रदर्शित होता है और यदि आप यूनिकोड वर्ण प्रदर्शित कर रहे हैं तो यह गड़बड़ हो जाएगा।
xji

2
हालांकि मापदंडों के माध्यम से नहीं होने दिया जा रहा है। मैं simple_form रत्न का उपयोग कर रहा हूं। क्या कोई सहसंबंध है।
xji

1
यह नियंत्रक से दृश्य को कम नहीं करता है, लेकिन कम से कम यह नियंत्रक से प्रदर्शित पाठ को कम कर देता है। बहुत बेहतर IMO।
माइक फॉक

13

किसी भी रत्न का उपयोग किए बिना @ vss123 द्वारा सुझाए गए समाधान के समान:

resources :plan do
  post :save, constraints: lambda {|req| req.params.key?(:propose)}, action: :propose
  post :save, constraints: lambda {|req| req.params.key?(:finalize)}, action: :finalize
end

ध्यान दें कि मैं मूल्य का उपयोग करने से बचता हूं और इनपुट नाम का उपयोग करता हूं क्योंकि सबमिट मूल्य को अक्सर अंतर्राष्ट्रीयकृत / अनुवादित किया जाता है। इसके अलावा, मैं इसे बहुत अधिक उपयोग करने से बचूंगा क्योंकि यह आपके मार्गों को जल्दी से अव्यवस्थित कर देगा।


9

हमने रेल में उन्नत बाधाओं का उपयोग करके हल किया ।

यह विचार एक ही पथ (और इसलिए समान नाम और मार्ग) का है, लेकिन विभिन्न कार्यों के लिए बाधाओं के साथ।

resources :plan do
  post :save, constraints: CommitParamRouting.new("Propose"), action: :propose
  post :save, constraints: CommitParamRouting.new("Finalize"), action: :finalize
end

CommitParamRoutingएक साधारण वर्ग है जिसके पास एक विधि है matches?जो सही है अगर कमिट दिए गए उदाहरण attr से मेल खाता है। मूल्य।

एक रत्न के रूप में यह उपलब्ध commit_param_matching


3

एक पुराना सवाल है, लेकिन जब से मैं उसी स्थिति से निपट रहा हूं, मैंने सोचा कि मैं अपना समाधान पोस्ट करूंगा। मैं कंट्रोलर लॉजिक और व्यू बटन के बीच विसंगति से बचने के लिए कंट्रोलर कॉन्स्टेंट का उपयोग कर रहा हूं।

class SearchController < ApplicationController
  SEARCH_TYPES = {
    :searchABC => "Search ABCs",
    :search123 => "Search 123s"
  }

  def search
    [...]
    if params[:commit] == SEARCH_TYPES[:searchABC]
      [...]
    elsif params[:commit] == SEARCH_TYPES[:search123]
      [...]
    else
      flash[:error] = "Search type not found!"]
      [...]
    end
  end
  [...]          
end

और फिर दृश्य में:

<% form_for(something) do |f| %>
    [...]
    <%= f.submit SearchController::SEARCH_TYPES[:searchABC] %>
    <%= f.submit SearchController::SEARCH_TYPES[:search123] %>
    [...]
<% end %>

इस तरह से पाठ केवल एक ही स्थान पर रहता है - नियंत्रक में एक स्थिर के रूप में। मैंने यह पता लगाने की कोशिश नहीं की है कि यह i18n कैसे, हालांकि।


"I18n" से आपका क्या तात्पर्य है?
skrrgwasme

क्या मार्ग में बाधाओं का उपयोग करना बेहतर था? धन्यवाद!
टिमोथी टी।

@ शब्द: i18n का अर्थ है 'अंतर्राष्ट्रीयकरण' - मूल रूप से, आप कई भाषाओं का समर्थन कैसे करेंगे। मैंने वास्तव में इस पर ध्यान नहीं दिया है, इसलिए मैं इससे परिचित नहीं हूं कि यह कैसे काम करता है या इसे कैसे लागू किया जाए।
१६:१४ पर द्रौणकोर

@ एंगेला - शायद नहीं :) और वास्तव में, मेरे कोड को रीक्रिएट करने के बाद मैंने बस एक से अधिक एकल रूपों के बजाय कई रूपों का निर्माण किया, एक एकल अखंड रूप जिसमें असंबंधित रूपों का एक समूह था।
१६:१४ पर द्रौणकोर

1

मेरे पास nested_form_fields के लिए मेरे फ़ॉर्म के सबमिट बटन की एक परिवर्तनीय संख्या है, इसलिए केवल नाम का उपयोग करना मेरे लिए पर्याप्त नहीं था। मैं प्रपत्र में एक छिपे हुए इनपुट फ़ील्ड सहित समाप्त हुआ और जावास्क्रिप्ट का उपयोग करके इसे पॉप्युलेट करने के लिए जब फॉर्म सबमिट बटन दबाया गया था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.