রেলস মডেল, ভিউ, কন্ট্রোলার এবং হেল্পার: কোথায় যায়?


155

রুবি অন রেলস ডেভেলপমেন্টে (বা সাধারণভাবে এমভিসি), কোথায় কোন যুক্তি রাখতে হবে সে সম্পর্কে আমার কোন দ্রুত নিয়ম অনুসরণ করা উচিত।

সম্মতিসূচক দয়া করে উত্তর দিন - সঙ্গে কি এখানে এই করা বদলে কি যে না করা

উত্তর:


173

MVC

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

দেখুন : ভিউতে কেবলমাত্র আপনার ডেটা (মডেল) প্রদর্শন করার জন্য ন্যূনতম কোড থাকা উচিত, এটি প্রচুর প্রক্রিয়াকরণ বা গণনা করা উচিত নয়, এটি মডেল দ্বারা গণিত ডেটা (বা সংক্ষিপ্ত) প্রদর্শন করা উচিত, বা নিয়ামক থেকে উত্পন্ন করা উচিত। যদি আপনার ভিউয়ের প্রকৃতপক্ষে এমন প্রক্রিয়াজাতকরণ করা প্রয়োজন যা মডেল বা নিয়ামক দ্বারা সম্পন্ন করা যায় না, কোডটি কোনও সহায়ককে রেখে দিন। একটি ভিউতে প্রচুর রুবি কোডগুলি পৃষ্ঠাগুলি পড়তে শক্ত করে তোলে।

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


2
লোকেরা ফ্যাট মডেল থেকে দূরে সরে যেতে শুরু করেছে। আমি আমার মডেলটিকে ডেটা স্ট্রাকচার হিসাবে ভাবতে চাই। তারপরে আমি কিছু রুবি অবজেক্ট লিখি যা আচরণটি কার্যকর করে, মডেলটি দিয়ে এটি সূচনা করে (এটি মডেলটিকে এটি একইভাবে ডেটা হিসাবে বিবেচনা করে যেমন আপনি স্ট্রিং এবং অ্যারেগুলিকে রেলের বাইরের অবজেক্টের ডেটা হিসাবে বিবেচনা করতে পারেন)। এই কৌশলটির উদাহরণ সহ একটি ভাল ভিডিও এখানে
জোশুয়া গাল

@ অ্যাডামডোনাহু আমি নিশ্চিত না যে চর্বিযুক্ত কোনও জিনিসকে ভাল জিনিস হিসাবে দেখা যেতে পারে। টোনস দায়বদ্ধতা পরিষেবাগুলিতে অন্তর্ভুক্ত থাকার চেয়ে ভাল।
ফতুহোকু

35

পাউলিফোনের উত্তরে যুক্ত করতে:

সহায়ক : ভিউ তৈরি করা সহজ করার জন্য ফাংশন। উদাহরণস্বরূপ, আপনি যদি উইজেটগুলির দামটি প্রদর্শন করতে সর্বদা তালিকাগুলি ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘন ঘুরে বেড়াতে থাকেন তবে এটি কোনও সহায়কের (প্রকৃত প্রদর্শনের জন্য একটি আংশিক পাশাপাশি) রাখুন। বা যদি আপনার কাছে আরজেএসের একটি টুকরা থাকে যা আপনি এই ভিউটিকে বিশৃঙ্খলা করতে চান না, তবে এটি কোনও সহায়ক হিসাবে রাখুন।


আসলে আমরা কী হেল্পারে সাইন_ইন পদ্ধতি রাখি না? যেমন আরআর
ইভান ওয়াং

14

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

ডোমেন ড্রাইভড ডিজাইনের পরিষেবাদির একটি ধারণা রয়েছে যা এমন একটি জায়গা যা আপনি যুক্তি বদ্ধ করেন যা বিভিন্ন ধরণের অবজেক্টের অর্কেস্টেট করতে হয় যার অর্থ সাধারণত যুক্তি বোঝায় যা প্রাকৃতিকভাবে কোনও মডেল শ্রেণীর অন্তর্ভুক্ত নয়।

আমি সাধারণত আমার অ্যাপ্লিকেশনগুলির API হিসাবে পরিষেবা স্তরটিকেই ভাবি। আমার পরিষেবা স্তরগুলি সাধারণত যে অ্যাপ্লিকেশনটি তৈরি করি তার প্রয়োজনীয়তার সাথে বেশ নিবিড়ভাবে মানচিত্র তৈরি করে এইভাবে সার্ভিস স্তরটি আমার অ্যাপের নীচের স্তরে পাওয়া আরও জটিল ইন্টারঅ্যাকশনগুলির সরলকরণ হিসাবে কাজ করে, আপনি পরিষেবা স্তরগুলিকে বাইপাস করে একই লক্ষ্য অর্জন করতে পারেন you এটি কাজ করতে আপনাকে আরও অনেক লিভার টানতে হবে।

নোট করুন যে আমি এখানে রেলগুলির বিষয়ে কথা বলছি না আমি একটি সাধারণ স্থাপত্য শৈলীর বিষয়ে কথা বলছি যা আপনার বিশেষ সমস্যাটির সমাধান করে।


এটি একটি দুর্দান্ত উত্তর :)
কার্লোস মার্টিনেজ

12

ইতিমধ্যে এখানে নিখুঁত ব্যাখ্যা, একটি খুব সাধারণ বাক্য উপসংহার হিসাবে এবং মনে রাখা সহজ:

আমাদের স্মার্ট মডেল, থিন কন্ট্রোলার এবং ডুম্ব ভিউ দরকার।

http://c2.com/cgi/wiki?ModelViewController



7

অনুমোদনের সাথে সম্পর্কিত সামগ্রী / অ্যাক্সেস নিয়ন্ত্রণকে নিয়ামকের মধ্যে রাখুন।

মডেলগুলি সব আপনার ডেটা সম্পর্কে। বৈধতা, সম্পর্ক, সিআরইউডি, ব্যবসায় যুক্তি

ভিউগুলি আপনার ডেটা দেখানোর বিষয়ে। কেবল ইনপুট প্রদর্শন করুন এবং পাচ্ছেন।

কন্ট্রোলাররা আপনার মডেল থেকে আপনার ভিউতে (এবং কোন দর্শন) এবং আপনার দর্শন থেকে আপনার মডেলটিতে কী ডেটা যায় তা নিয়ন্ত্রণ করার বিষয়ে। মডেলগুলি ছাড়াও কন্ট্রোলারগুলির উপস্থিতি থাকতে পারে।

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

তেমনিভাবে আপনি যদি টেলারকে কিছু দেখতে চান (দেখুন) তবে দ্বিতীয় কথক ব্যতীত মূলত একই জিনিস ঘটে তা আপনাকে জানাবে যে ম্যানেজার আপনার তথ্য স্বীকার করেছে কিনা। এটিও সম্ভব যে সুরক্ষারক্ষী / অভ্যর্থনাবিদ (নিয়ন্ত্রণকারী) আপনাকে মাইক্রো গ্রহণের কথা বলেছিল যেহেতু আপনি ম্যানেজারকে সেই তথ্য জানাতে অনুমোদিত নন।

সুতরাং রূপকটি প্রসারিত করার জন্য, আমার স্টেরিওটাইপড এবং অবাস্তব জগতে, টেলাররা (মতামত) বেশ সুন্দর কিন্তু খালি মাথাওয়ালা এবং প্রায়শই আপনি তাদের যা কিছু বলে বিশ্বাস করেন, সুরক্ষারক্ষী / সংবর্ধনাবাদীরা ন্যূনতম তবে তারা খুব জ্ঞানবান নয় তবে তারা জানেন যে লোকেরা কোথায় উচিত এবং যাওয়া উচিত নয় এবং পরিচালকগণ সত্যই কুরুচিপূর্ণ এবং অর্থহীন তবে সমস্ত কিছু জানেন এবং সত্য এবং কোনটি নয় তা বলতে পারবেন।


4

একটি জিনিস যা সঠিকভাবে পৃথক হতে সহায়তা করে তা হল "এন্টি-প্যাটার্নটি দেখতে নিয়ামক থেকে স্থানীয় ভেরিয়েবলগুলি পাস করুন" এড়ানো। এর পরিবর্তে:

# app/controllers/foos_controller.rb:
class FoosController < ApplicationController

  def show
    @foo = Foo.find(...)
  end

end

#app/views/foos/show.html.erb:
...
<%= @foo.bar %>
...

সহায়িকার পদ্ধতি হিসাবে উপলভ্য এমন গেটরে নিয়ে যাওয়ার চেষ্টা করুন:

# app/controllers/foos_controller.rb:
class FoosController < ApplicationController

  helper_method :foo

  def show
  end

  protected

  def foo
    @foo ||= Foo.find(...)
  end

end

#app/views/foos/show.html.erb:
...
<%= foo.bar %>
...

এটি "@foo" এ কী কী ব্যবহার হয় এবং এটি কীভাবে ব্যবহৃত হয় তা সংশোধন করা সহজ করে তোলে। এটি আরও জটিল না করে নিয়ামক এবং দৃশ্যের মধ্যে বিচ্ছেদ বৃদ্ধি করে।


আহম্মম ... ইউক আপনি যখন এটি করতে পারেন দয়া করে কিছু ভাল কারণ / পরিস্থিতি যুক্ত করতে পারেন। এটি কিআইএসএস এবং ইয়াগনিআইকে ভেঙে দেয় এবং খুব দুর্গন্ধযুক্ত (কেবল আরও একটি
ক্লিশে

2
1) কন্ট্রোলারের দৃষ্টান্তের ভেরিয়েবলগুলি আপনার দর্শনীয় দৃষ্টিতে অনুলিপি করতে রেলগুলি প্রচুর যাদু করে। 2) প্রস্তাবিত বাস্তবায়ন কেবল অ্যাক্সেস করা হলেই ফু লোড করে দেয়, যা কিছু কাজ কিছু সময় সাশ্রয় করতে পারে। যদিও গুরুত্বপূর্ণ উত্তরটি আসলে 1), যদিও।
ওয়েবম্যাট

11
দীর্ঘশ্বাস এই ভয়ানক। রেলের উদাহরণের পরিবর্তনশীল ভাগ করে নেওয়া এমন বৈশিষ্ট্য যা কোনও অ্যান্টি-প্যাটার্ন নয়। এটি একটি সর্বব্যাপী, স্বল্প-মানসিক-ওভারহেড সিনট্যাকটিক চিনি যা খুব কমই যদি সত্যিকারের সমস্যা সৃষ্টি করে। আপনি যদি এটি পছন্দ করেন না, সূক্ষ্ম, তবে বারোক অ-মানক কাঠামোর সাথে চারপাশে কোডিং করা বিষয়গুলিকে সীমাহীনভাবে খারাপ করে দেয়। এই ক্ষেত্রে আপনি কার্যকরভাবে একটি বৈশ্বিক (প্রতি নিয়ামক হিসাবে যাইহোক) পরিবর্তনশীল তৈরি করছেন are নাটকীয়ভাবে স্কোপ বাড়িয়ে ভেরিয়েবল স্কোপিংয়ের একটি উপলব্ধি করা অপব্যবহার সংশোধন করার চেষ্টা করা অত্যন্ত বিদ্রূপজনক।
gtd

1
আমি এটি কিনছি না, dasil003। এর ব্যাপ্তি fooএবং এর @fooপরিমাণ একই - এগুলি উভয়ই <কন্ট্রোলারক্লাস, অনুরোধ> জুটির কাছে বিভক্ত। অধিকন্তু, গিটার সংস্করণ ব্যবহার করে, আমি পরিবর্তন করতে পারি যে কীভাবে সেই Fooবস্তুটি খুঁজে পাওয়া / সঞ্চয় / ক্যাশে করা হয় তা ভিউ কীভাবে এটি অ্যাক্সেস করে তা পরিবর্তন না করেই।
জেমস এ রোজেন

1
আমি মনে করি আপনি "অ্যান্টি-প্যাটার্ন ভেরিয়েবলগুলি" অ্যান্টি-প্যাটার্ন বলতে চান। উদাহরণস্বরূপ, পুরো রেন্ডারের জন্য রাজ্য ফাঁস হবে, এমনকি গভীরভাবে নেস্টেড পার্টিয়ালগুলিতেও। আপনার সমাধানটিও রাষ্ট্র ফাঁস করে দেয় তবে উদাহরণস্বর চেয়ে কিছুটা ভাল কারণ এটি পুনরায় নিয়োগের অনুমতি দেয় না। স্থানীয়ভাবে পাস করা আসলে সর্বোত্তম কারণ এটি কোনও পদ্ধতি কল করার মতো; স্থানীয় লোকেরা পার্টিয়াল দ্বারা দেখা যায় না। এই উত্তর দেখুন ।
কেলভিন

2

ঠিক আছে, এটির উপর নির্ভর করে যে যুক্তিটি কীভাবে মোকাবেলা করতে পারে তার উপর ...

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

এছাড়াও, গুগলের একটি দ্রুতগতিতে কী ঘটে যায় তার কয়েকটি আরও দৃ concrete় উদাহরণ প্রকাশ করে।

মডেল: বৈধতা প্রয়োজনীয়তা, ডেটা সম্পর্ক, পদ্ধতি তৈরি, আপডেট পদ্ধতি, পদ্ধতি ধ্বংস, পদ্ধতিগুলি সন্ধান করুন (মনে রাখবেন যে এই পদ্ধতিগুলির জেনেরিক সংস্করণ কেবল আপনার উচিত নয়, তবে যদি আপনি প্রচুর পরিমাণে করছেন তবে যেমন লোকেদের সাথে মানুষ খুঁজে পাওয়া পদবি দেওয়া চুল, তারপরে আপনার সেই যুক্তিটি বের করা উচিত যাতে আপনাকে যা করতে হবে তা ফাইন্ড_এডিএইচ_বাই_নেম ("স্মিথ") বা এরকম কিছু কল করা উচিত)

দেখুন: এটি সমস্ত ডেটা ফর্ম্যাট করার বিষয়ে হওয়া উচিত, ডেটা প্রক্রিয়াকরণ নয়।

নিয়ামক: এটি এখানে ডেটা প্রসেসিং যায়। ইন্টারনেট থেকে: "নিয়ন্ত্রণকারীর উদ্দেশ্য হ'ল ব্যবহারকারীর দ্বারা অনুরোধ করা ক্রিয়াটির প্রতিক্রিয়া জানানো, ব্যবহারকারী নির্ধারিত কোনও পরামিতি গ্রহণ, ডেটা প্রক্রিয়া করা, মডেলটির সাথে যোগাযোগ করা এবং তারপরে চূড়ান্ত আকারে অনুরোধ করা ডেটা পাস করে দেওয়া দেখতে। "

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


0

সাধারণ কথায়, সাধারণত, মডেলগুলির টেবিল (গুলি) সম্পর্কিত সমস্ত কোড, তাদের সহজ বা জটিল সম্পর্ক (একাধিক টেবিল জড়িত তাদেরকে এসকিএল কোয়েরি হিসাবে ভাবেন), ব্যবসায়িক যুক্তি ব্যবহার করে কোনও ফলাফল আসতে ডেটা / ভেরিয়েবলের ম্যানিপুলেশন থাকবে ।

অনুরোধকৃত কাজের জন্য কন্ট্রোলারদের সংশ্লিষ্ট মডেলগুলির দিকে কোড / পয়েন্টার থাকবে।

দর্শনগুলি ব্যবহারকারীর ইনপুট / মিথস্ক্রিয়া গ্রহণ করবে এবং ফলাফলের প্রতিক্রিয়া প্রদর্শন করবে।

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


-1

পরীক্ষা, পরীক্ষা ... মডেলটিতে যতটা সম্ভব যুক্তি রাখুন এবং তারপরে আপনি এটি সঠিকভাবে পরীক্ষা করতে সক্ষম হবেন। ইউনিট টেস্টগুলি ডেটা এবং এটি যেভাবে মডেলটি পরীক্ষা করে তৈরি হয় তা পরীক্ষা করে এবং কার্যকরী পরীক্ষাগুলি নিয়ন্ত্রণকারীদের পরীক্ষা করে এটি যেভাবে চালিত বা নিয়ন্ত্রণ করা হয় তা পরীক্ষা করে, সুতরাং এটি অনুসরণ করে যে আপনি যদি ডেটাতে না থাকেন তবে টেস্টের অখণ্ডতা পরীক্ষা করতে পারবেন না মডেলটি.

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