আমি কীভাবে একই প্রকারের জন্য একাধিক জমা বোতাম তৈরি করতে পারি?


98

আমার একাধিক জমা বোতাম থাকা দরকার।

আমার কাছে একটি ফর্ম রয়েছে যা যোগাযোগ_কালের একটি উদাহরণ তৈরি করে।

একটি বোতাম এটিকে স্বাভাবিক হিসাবে তৈরি করে।

অন্য বোতামটি এটি তৈরি করে তবে এটির আলাদা হওয়া দরকার: ডিফল্ট থেকে অ্যাট্রিবিউট মান, এবং এটি নিয়ামকটিতে ব্যবহৃত আলাদা, তবে সম্পর্কিত মডেলটিতেও বৈশিষ্ট্য নির্ধারণ করতে হবে।

আমি কেমন করে ঐটি করি? আমি রুটটি পরিবর্তন করতে পারছি না, তাই কি কোনও আলাদা ভেরিয়েবল পাঠানোর কোনও উপায় আছে যা [: প্যারাম] দ্বারা তুলে নেওয়া হয়েছে?

এবং আমি যদি তখন করি তবে আমি কন্ট্রোলারে কী করব, কেস স্টেটমেন্ট সেট আপ করব?



4
এইটির বয়স বেশি এবং আরও বেশি ভোট রয়েছে has উপরের কিছু যদি এর সদৃশ হিসাবে বন্ধ করা উচিত ...
তারিন পূর্ব

উত্তর:


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

তবে মনে রাখবেন যে এটি আপনার দৃষ্টিভঙ্গিটিকে নিয়ামকের সাথে দৃler়ভাবে জুড়ে দেয় যা খুব পছন্দসই নয়।


4
এখন নতুন কিছু আছে। ধন্যবাদ @ অনুরাগ!
শ্রীপদ ​​কৃষ্ণ

4
সুতরাং কেবল 'এ' রেখে স্বয়ংক্রিয়ভাবে প্যারামিটারের নাম = 'কমিট' তৈরি করবেন?
টিমোথি টি।

আপনি কি নিয়ন্ত্রকের সাথে দৃ couple়ভাবে দম্পতি না দেওয়ার কথা বলেছিলেন এমন কোনও উপায় আছে? উদাহরণস্বরূপ, ইউআরএল পরিবর্তন করার জন্য জমা বোতামগুলির জন্য? এটা তোলে বলে মনে হয় যে এই অগত্যা খারাপ কারণ একটি ফর্ম জমা দিয়েছে ভেরিয়েবল যা hte নিয়ামক আচরণ পরিবর্তন করতে পারেন, ই যদি এটা ব্যবহারকারীর ইনপুট Ven, বোতাম নির্বাচন যা নয়?
টিমোথি টি।

4
অগোছালো জেএস হ্যাক ব্যতীত আপনি কোনও ফর্ম ক্রিয়া বৈশিষ্ট্য পরিবর্তন করতে পারবেন না।
বেন ওরোজকো

ফ্লাইতে ফর্ম ক্রিয়া বৈশিষ্ট্যটি পরিবর্তন করা আরও ভঙ্গুর সমাধান। কমিট অ্যাট্রিবিউট ব্যবহার তাই কম। আপনি বিকল্প হিসাবে দ্বিতীয় ফর্মের ভিতরে দ্বিতীয় জমা বোতামটি মোড়ানো করতে পারেন এবং একই ক্রিয়ায় পরিবর্তন করতে হবে এমন একটি পরামিতি পাস করতে পারেন। তবে এটি 2 জমা বোতামের মানগুলির উপর নির্ভর করার চেয়ে আলাদা নয়। আপনি কীভাবে এই জিনিসটি সেটআপ করেছেন সে সম্পর্কে আরও না জেনে, এখন পর্যন্ত সর্বোত্তম সমাধান হ'ল 2 টি বোতাম জমা দেওয়া বাটন।
অনুরাগ

78

সাবমিট বাটনে ফর্মেশন অ্যাট্রিবিউট ব্যবহার করে আরও একটি পদ্ধতি রয়েছে:

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

কোডটি পরিষ্কার থাকে, যেমন স্ট্যান্ডার্ড ক্রিয়েট বাটনটির কোনও পরিবর্তন প্রয়োজন হয় না, আপনি কেবলমাত্র বিশেষ বোতামের জন্য একটি রাউটিং পথ সন্নিবেশ করান:

গঠন:
কোনও প্রোগ্রামের ইউআরআই যা ইনপুট উপাদান দ্বারা জমা দেওয়া তথ্যগুলিকে প্রক্রিয়াজাত করে, যদি এটি জমা বাটন বা চিত্র হয় is যদি নির্দিষ্ট করা থাকে তবে এটি উপাদানটির ফর্মের মালিকের ক্রিয়াকলাপটিকে ওভাররাইড করে । সূত্র: এমডিএন


4
এই সব ব্রাউজার জুড়ে সমর্থিত w3schools.com/tags/att_button_formaction.asp w3schools.com/tags/att_input_formaction.asp
সুমিত Garg

8
আমি বুঝতে পারি যে প্রশ্নটি পুরানো, তবে আমি পাঠকদের পরামর্শ দিচ্ছি যে এই সংক্ষিপ্ত সমাধানটি আরও ভাল বিবেচনার দাবি রাখে।
জেরোম

4
আমি আশা করি প্রথমবার যখন আমি এই একই প্রশ্নটি পেয়েছি তখন এই উত্তরটি খুঁজে পেয়েছি। আমি আনন্দিত আমি এবার আরও গভীর দেখার সিদ্ধান্ত নিয়েছি। দুর্দান্ত সমাধান।
রকসব্যাচচাস

4
আমি এই সমাধানটি সত্যিই পছন্দ করি। তবে আমাকে সিএসআরএফ টোকেনের সাথে একটি গোপন ক্ষেত্র যুক্ত করতে হয়েছিল যদিও আমি ইতিমধ্যে ফর্ম সহায়ক বা রেলগুলি টোকেন গ্রহণ না করে। আমি এর থেকে ভালতর কাজ খুঁজে পাইনি এবং এখনও ঠিক জানি না কেন এটি ঘটে বা ঠিক টোকন যুক্ত করে আবার এটি ঠিক করে দেয়।
ইরুপুতুনকু

আমি মনে করি এটিই আরও ভাল সমাধান কারণ এটি একক দায়িত্বের নীতিগুলিকে সম্মান করে এবং সবকিছু পরিষ্কার করে রাখে প্রতিটি বোতাম কন্ট্রোলারগুলিতে সহজ যুক্তি রাখার নিজস্ব ক্রিয়া সম্পাদন করে।
খলিল ঘরবাউই

30

আপনি বিকল্প হিসাবে সনাক্ত করতে পারবেন কোন বোতামটির বৈশিষ্ট্যের নাম পরিবর্তন করে টিপানো হয়েছিল।

<% 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]যার উপর নির্ভর করে এক চাপা ছিল।


4
এখনও নিয়ামকের কাছ থেকে ভিউ ডিকুয়াল করে না।
ধীরগতি

4
হ্যাঁ, যদি ডিকুবলের অর্থ আপনি সঠিকভাবে চূড়ান্ত ক্রিয়াটির দিকে রচনার জন্য ক্রিয়ায় কিছু যুক্তি এড়িয়ে চলেন তবে সেগুলি এখনও যুগল। আমি কেবল বোঝাতে চাইছি যে আপনি যদি সেই যুক্তিতে নামটির বৈশিষ্ট্যটি ব্যবহার করেন তবে আপনার নিয়ামকটি বোতামটিতে যা দেখানো হয়েছে তার থেকে স্বতন্ত্র। ধন্যবাদ, সম্পাদিত
ম্যাসিগুগো

4
এইটি আই 18 এন পরিস্থিতিতে গ্রহণযোগ্যটির চেয়ে ভাল বলে মনে হচ্ছে কারণ "মান" প্রদর্শিত হয় এবং আপনি যদি ইউনিকোড অক্ষর প্রদর্শন করেন তবে এটি অগোছালো হয়ে যাবে।
এক্সজি

4
তবে পরামিতিগুলি দিয়ে দেওয়া হচ্ছে না। আমি সরল_রফর্ম রত্ন ব্যবহার করছি। কোন সম্পর্ক আছে।
এক্সজি

4
এটি নিয়ামকের কাছ থেকে ভিউটি ডিকোপল করে না, তবে কমপক্ষে এটি নিয়ামক থেকে প্রদর্শিত পাঠ্যকে ডিকুপল করে। আরও ভাল আইএমও
মাইক ফোক

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

CommitParamRoutingmatches?কমপট পরম প্রদত্ত দৃষ্টান্তের অ্যাট্রিটারের সাথে মিলে গেলে এমন একটি পদ্ধতি রয়েছে যা একটি সঠিক পদ্ধতিতে আসে true মান।

এটি মণি কমিট_প্রেম_ম্যাচিং হিসাবে উপলব্ধ ।


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 করতে হবে তা জানার চেষ্টা করি নি।


"আই 18 এন" বলতে কী বোঝ?
skrrgwasme

এই কি রুটে বাধা ব্যবহার করার পক্ষে পছন্দনীয় ছিল? ধন্যবাদ!
টিমোথি টি।

@ স্কট: আই 18 এন এর অর্থ 'আন্তর্জাতিকীকরণ' - মূলত আপনি কীভাবে একাধিক ভাষাকে সমর্থন করবেন। আমি সত্যিই এটি খতিয়ে দেখিনি, সুতরাং এটি কীভাবে কাজ করে বা কীভাবে এটি বাস্তবায়ন করতে পারে সে সম্পর্কে আমি খুব বেশি পরিচিত নই।
ড্রাকনর

@ অ্যাঙ্গেলা - সম্ভবত নয় :) এবং আসলে, আমার কোডটি রিফ্যাক্ট করার পরে আমি কেবল একক একক একক ফর্মের পরিবর্তে একাধিক ফর্ম তৈরি করেছি, যার মধ্যে একটি সম্পর্কহীন ফর্ম রয়েছে।
ড্রাকনর

1

নেস্টেড_ফর্ম_ফিল্ডসকে ধন্যবাদ জানাতে আমার ফর্মটিতে একটি পরিবর্তনশীল সংখ্যক বোতাম রয়েছে, তাই কেবল নাম ব্যবহার করা আমার পক্ষে যথেষ্ট ছিল না। আমি ফর্মের একটি লুকানো ইনপুট ক্ষেত্র সহ এবং জাভাস্ক্রিপ্ট ব্যবহার করে এটি পপুলেট করে ফর্ম জমা দেওয়ার বোতামগুলির একটিতে চাপ দেওয়া হয়েছিল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.