রেলস: একটি নিয়ামক থেকে অন্য একটি নিয়ামক পদক্ষেপ কল করুন


118

কন্ট্রোলার বি থেকে আমাকে কন্ট্রোলার এ -তে ক্রিয়া অ্যাকশনটি কল করতে হবে

কারণটি হ'ল যখন আমি কন্ট্রোলার বি থেকে কল করছি তখন আমার আলাদাভাবে পুনঃনির্দেশ করা দরকার I

এটা কি কারাগারে করা যায়?



আপনি কি পোস্ট বা জিইটি অ্যাকশন সম্পর্কে বলছেন? যদি জিইটি হয় তবে আপনি কেবল সেই ক্রিয়াতে পুনর্নির্দেশ করতে পারেন। তবে এর কারণটি নিখুঁতভাবে পরিষ্কার নয় কারণ আপনি নিয়ন্ত্রক এ থেকে আপনি যে কোনও ইউআরএল চাইলে পুনঃনির্দেশ করতে পারেন।
ভলডি

উত্তর:


64

আপনি সেই ক্রিয়ায় পুনর্নির্দেশটি ব্যবহার করতে পারেন:

redirect_to your_controller_action_url

আরও চালু: রেল গাইড

নতুন ক্রিয়াটি কেবল রেন্ডার করতে:

redirect_to your_controller_action_url and return

5
আমি দুঃখিত তবে আপনি কি বলতে পারবেন প্রথম লাইন এবং দ্বিতীয় লাইনের মধ্যে পার্থক্য কী? আমি মনে করি প্রথমে কোডের বাকী রেখাগুলি সম্পাদন করবে এবং তারপরে পুনঃনির্দেশ করবে। এটা কি ঠিক?
aks

আমি ভাবছিলাম সম্ভবত শেষ উদাহরণটি টাইপোর ছিল এবং তার renderপরিবর্তে হওয়া উচিত redirect_to। আপনি কি বলছেন, @ এসপ্রেস?
ম্যাগনে

1
হাই @ স্পাইরোস, এটি redirect_toব্যবহারের অনুমতি দেয় না post: :methodএবং এটি বিশেষত createঅন্য কন্ট্রোলারের একটি ইতিমধ্যে বিদ্যমান ক্রিয়ায় পুনঃনির্দেশের জন্য কার্যকর হতে পারে যেহেতু @ddayan প্রথমবার জিজ্ঞাসা করেছিল। আমার একই পরিস্থিতি আছে যেখানে কিছু পরিস্থিতিতে আমার অন্য একটি জিনিস তৈরি করা উচিত। অন্য createক্রিয়াকলাপটি কল করা DRYer হতে পারে ..
সানজিবুকাই

53

অন্যের থেকে একজন নিয়ামক ব্যবহার করতে, এটি করুন:

def action_that_calls_one_from_another_controller
  controller_you_want = ControllerYouWant.new
  controller_you_want.request = request
  controller_you_want.response = response
  controller_you_want.action_you_want
end

18
যদি আপনি চান কলব্যাকগুলি এখনও controller_you_wantআপনার মধ্যে কার্যকর করাতে চানcontroller_you_want.process(:action_you_want)
কনস্টান্টিজেন স্কেপেনস

3
ধন্যবাদ! আপনি যে পরিস্থিতিতে পুনঃনির্দেশ করতে চান না সেখানে এটি আপনার পক্ষে খুব কার্যকর, আপনি কেবলমাত্র একজন নিয়ামক থেকে অন্যটিতে পদক্ষেপ গ্রহণের জন্য দ্রুত সমাধান প্রয়োজন। পুনঃনির্দেশ করা সত্যিই আলাদা কিছু। এছাড়াও: render status: :ok, json: JSON.parse(controller.render(:action_you_want).first)অন্যান্য নিয়ামক থেকে
জেএসএনকে

1
দুর্দান্ত উত্তর, ঠিক আমি যা খুঁজছিলাম। একটি প্রশ্ন - প্যারামিটারগুলি এখানে নিতে কী বিন্যাসের অনুরোধ করবে? আমি ধরে নিই যে তারা নীচে বাস করে controller_you_want.requestতবে এই গুলিটি একটি হ্যাশ বা পরামিতি উদাহরণ দিয়ে পাস করতে সক্ষম হয় নি।
এসআরাক

আপনি @ এসআরএকে কি জিজ্ঞাসা করছেন তা আমি নিশ্চিত নই। paramsকাছে উপলভ্য হতে controller_you_wantসেটিং দ্বারা request3rd লাইনে। তুমি কি তাই জিজ্ঞাসা করছ?
স্যামি লার্বি

1
রেল 5 এর চেষ্টা করে, রেন্ডারিংয়ের জন্য এটি হওয়া উচিতrender html: controller_you_want.process(:action_you_want)
নাজার কুলিয়েভ

41

আপনি যে যুক্তি উপস্থাপন করছেন তা এমভিসি নয়, তারপরেও নয়, সামঞ্জস্যপূর্ণ।

  • একটি নিয়ামক একটি দৃশ্য রেন্ডার করে বা পুনর্নির্দেশ করে

  • একটি পদ্ধতি কোড চালায়

এই বিবেচনাগুলি থেকে, আমি আপনাকে পরামর্শ দিচ্ছি যে আপনার নিয়ামকটিতে পদ্ধতি তৈরি করুন এবং আপনার ক্রিয়া থেকে তাদের কল করুন।

উদাহরণ:

 def index
   get_variable
 end

 private

 def get_variable
   @var = Var.all
 end

এটি বলেছিল যে আপনি বিভিন্ন কন্ট্রোলারের মাধ্যমে ঠিক একই কাজ করতে পারবেন এবং আপনি বি বিতে থাকাকালীন নিয়ন্ত্রক এ থেকে একটি পদ্ধতি আহবান করতে পারেন mon

শব্দভাণ্ডার অত্যন্ত গুরুত্বপূর্ণ তাই আমি খুব জোর দিয়েছি।


আমি জানি আমার এটি করা উচিত নয়, তবে এটি আমার আবেদনের অংশ নয় এটি কেবল আমার অ্যাপ্লিকেশনটি পরীক্ষা ও মূল্যায়নের জন্য।
ddayan

9
এটি ভালবাসুন .. রেন্ডার থেকে পদ্ধতিটি আলাদা করুন, এবং তারপরে প্রয়োজন অনুযায়ী পৃথক পদ্ধতিতে কল করুন। শুধু একটি প্রশ্ন .. get_variableএখন অন্য নিয়ামক থেকে কিভাবে বলা যেতে পারে?
ভাসমান

1
@ ফ্লাইটিং রক আপনার প্রশ্ন / মন্তব্যটি কেবলমাত্র খেয়াল করেছেন: আপনার কাছে বেশ কয়েকটি বিকল্প রয়েছে: সাধারণ পূর্বপুরুষের মধ্যে সংজ্ঞা দেওয়া যেতে পারে বা আপনি সাধারণ
মিক্সিন

উত্তরের উত্তরটি পছন্দ করুন, অনুমানযোগ্য বাক্য খণ্ড সম্পর্কে অনিশ্চিত
জেরার্ড সিম্পসন

30

আপনি url_forএকটি নিয়ামক এবং ক্রিয়াটির জন্য ইউআরএল পেতে ব্যবহার করতে পারেন এবং তারপরে redirect_toসেই URL এ যাওয়ার জন্য ব্যবহার করতে পারেন।

redirect_to url_for(:controller => :controller_name, :action => :action_name)

1
অন্যটি আমার পক্ষে কাজ করে বলে মনে হচ্ছে না, এটি আরও ভাল দেখাচ্ছে, তবে আমরা কীভাবে পরামিতিগুলি পাস করব?
মিশনজয়

3
@ সংজেয় আপনি অন্যান্য প্যারামিটার হিসাবে url_for করতে পারেন। উদাহরণস্বরূপ redirect_to url_for(:controller => :controller_name, :action => :action_name, :param1 => :val1, :param2 => :val2)ফলাফল হবে /contorller_name/action_name?param1=val1&param2=val2দস্তাবেজগুলি
অ্যারিল অ্যালন

যদি আমি "মডিউল :: মাইকন্ট্রোলার" এর মত একটি নিয়ামক থেকে "মাইআউটকন্ট্রোলার" এর মতো কোনও রুট কন্ট্রোলারকে পুনঃনির্দেশিত করার চেষ্টা করি .. এটি "মডিউল / মায়োথ্রন্ট্রোলার" কল করার সমাধান করবে .. কোনও ধারণা কীভাবে আমি রুটটিকে কল করতে পারি?
ggez44

12

এটি অন্য নিয়ামক ক্রিয়াকে কল করা খারাপ অভ্যাস।

তোমার উচিত

  1. আপনার কন্ট্রোলার বি এ ক্রিয়াটি সদৃশ করুন, বা
  2. এটি একটি মডেল পদ্ধতি হিসাবে মোড়ানো, যা সমস্ত নিয়ামকের সাথে ভাগ করা হবে, বা
  3. আপনি এই ক্রিয়াটি নিয়ামক এ প্রসারিত করতে পারেন

আমার মতামত:

  1. প্রথম দৃষ্টিভঙ্গি DRY নয় তবে এটি অন্য ক্রিয়া আহ্বানের চেয়ে আরও ভাল।
  2. দ্বিতীয় পদ্ধতির ভাল এবং নমনীয়।
  3. তৃতীয় পদ্ধতিটি আমি প্রায়শই করতাম। সুতরাং আমি সামান্য উদাহরণ দেখাব।

    def create
      @my_obj = MyModel.new(params[:my_model])
      if @my_obj.save
        redirect_to params[:redirect_to] || some_default_path
       end
    end

সুতরাং আপনি এই ক্রিয়াকলাপের কাছে পাঠাতে পারেন redirect_to, যা আপনি চাইলে যে কোনও পথ হতে পারে।


হাই, সলিউশন বি মোড়কে মডেল পদ্ধতি হিসাবে, আদৌ কোনও মডেল না থাকলে কীভাবে মোড়ানো যায়? আমরা একটি অনুসন্ধান ইঞ্জিনে কাজ করছি এবং অন্যান্য ইঞ্জিনগুলি থেকে অনুসন্ধান ইঞ্জিনে অনুসন্ধান দর্শনগুলিতে কল করতে চাই। অনুসন্ধানের ক্রিয়াটির জন্য কোনও ডেটা মডেল নেই।
user938363

@ ব্যবহারকারী938363 - সম্ভবত দুটি ক্রিয়া উভয়েরই একই মতামত রেন্ডার করতে পারে (এমনকি যদি সেই ক্রিয়াগুলি বিভিন্ন নিয়ামক হিসাবে থাকে)। "রেন্ডার" কলটি নিজেই সদৃশ হবে তবে এটি কেবল নকলের এক লাইন so এটি এত খারাপ নয়। যদি আপনার কাছে প্রচুর যুক্তি থাকে যা রেন্ডার কলটি পাস করার জন্য প্যারামিটারগুলির হ্যাশ প্রস্তুত করে, তবে আপনি এটির নিজের ফাইলে স্থানান্তরিত করে (সম্ভবত কোনও মডেল /modelsবা একটি সাধারণ শ্রেণি বা মডিউল ইন /lib) নকল করা এড়াতে পারেন । সমস্যা কেবলমাত্র যদি আপনার কন্ট্রোলার উদাহরণ ভেরিয়েবলের মাধ্যমে দর্শনটির সাথে যোগাযোগ করে - আপনাকে সেই নকলটি অন্য কোনও উপায়ে ঠিক করতে হবে d
অ্যান্টিনোম

আপনার যদি এমন কোনও ইউজার কনট্রোলার থাকে যা একটি নতুন ব্যবহারকারী (নিবন্ধকরণ) তৈরি করে এবং সাফল্যের পরে আপনি একটি সেশনস কনট্রোলার এবং সত্যায়িত ব্যবহারকারীকে অনুরোধ করতে চান? এই ক্ষেত্রে আপনি এক উপায়ে বা অন্য কোনও সেশনস কনট্রোলারকে ডেকে আনুন। এই সম্পর্কে কোন চিন্তা?
দ্বিপশু_মোহন্ত

কেন এটি একটি খারাপ অভ্যাস? স্যামি লাম্বির উত্তর নিয়ে কী সমস্যা?
ভাসিলাকিসফিল

7

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


6

রচনা উদ্ধার!

কারণ হিসাবে দেওয়া হয়েছে, নিয়ন্ত্রকদের জুড়ে ক্রিয়াকলাপের পরিবর্তে কোডের ভাগ করা এবং কাস্টম অংশগুলি পৃথক করার জন্য নিয়ন্ত্রকদের ডিজাইন করা উচিত। এটি উভয় এড়াতে সহায়তা করবে - কোড সদৃশ এবং ব্রেকিং এমভিসি প্যাটার্ন।

যদিও এটি বিভিন্ন উপায়ে করা যেতে পারে, উদ্বেগগুলি ( রচনা ) ব্যবহার করা একটি ভাল অনুশীলন।

# controllers/a_controller.rb
class AController < ApplicationController
  include Createable

  private def redirect_url
    'one/url'
  end
end

# controllers/b_controller.rb
class BController < ApplicationController
  include Createable

  private def redirect_url
    'another/url'
  end
end

# controllers/concerns/createable.rb
module Createable
  def create
    do_usefull_things
    redirect_to redirect_url
  end
end

আশা করি এইটি কাজ করবে.


2

আপনি ক্রিয়াটির ভিতরে অন্য ক্রিয়াকে নিম্নরূপ কল করতে পারেন:

পুনর্নির্দেশ_অ্যাকশন: 'ক্রিয়া_নাম'

class MyController < ApplicationController
  def action1
   redirect_to action: 'action2'
  end

  def action2
  end
end

-6

এই ফাংশনগুলি নিয়ন্ত্রকদের থেকে পৃথক করুন এবং এগুলি মডেল ফাইলে রাখুন। তারপরে আপনার নিয়ামকটিতে মডেল ফাইলটি অন্তর্ভুক্ত করুন।


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