রেল ৩.১: ইঞ্জিন বনাম মাউন্টেবল অ্যাপ্লিকেশন


120

কেউ কি আমাকে একটি রেল ইঞ্জিন এবং মাউন্টেবল অ্যাপ্লিকেশনটির মধ্যে পার্থক্য বুঝতে সাহায্য করতে পারে? রেল ৩.১ এ, আপনি "রেললাইন নতুন প্লাগিন _ __ " কমান্ডের সাহায্যে একটি তৈরি করতে পারেন ।

rails plugin new forum --full        # Engine
rails plugin new forum --mountable   # Mountable App

আপনি কখন অন্যটি বনাম ব্যবহার করতে চান? আমি জানি আপনি একটি ইঞ্জিনকে রত্ন হিসাবে প্যাকেজ করতে পারেন। মাউন্টেবল অ্যাপ্লিকেশনের ক্ষেত্রে কি এমনটি হয় না? আর কী পার্থক্য আছে?

উত্তর:


143

আমি নিম্নলিখিতটি লক্ষ্য করেছি:

পূর্ণ ইঞ্জিন

একটি পূর্ণ ইঞ্জিন সহ, প্যারেন্ট অ্যাপ্লিকেশন ইঞ্জিন থেকে রুট উত্তরাধিকার সূত্রে পায়। এটিতে কিছু নির্দিষ্ট করার দরকার নেই parent_app/config/routes.rb। মডেল, রুট ইত্যাদির উত্তরাধিকারী হিসাবে পিতৃ অ্যাপ্লিকেশনটির জন্য জেমফাইলে রত্ন উল্লেখ করা যথেষ্ট The

# my_engine/config/routes.rb 
Rails.application.routes.draw do 
  # whatever 
end 

মডেল, নিয়ন্ত্রক, ইত্যাদির কোনও নেমস্পেসিং নেই এইগুলি তাত্ক্ষণিক প্যারেন্ট অ্যাপ্লিকেশনে অ্যাক্সেসযোগ্য।

মাউন্টেবল ইঞ্জিন

ইঞ্জিনের নাম স্থানটি ডিফল্টরূপে পৃথক করা হয়:

# my_engine/lib/my_engine/engine.rb
module MyEngine 
  class Engine < Rails::Engine 
    isolate_namespace MyEngine 
  end 
end

মাউন্টেবল ইঞ্জিন সহ, রুটগুলি নামগতির হয় এবং প্যারেন্ট অ্যাপগুলি একক রুটের অধীনে এই কার্যকারিতাটি বান্ডেল করতে পারে:

# my_engine/config/routes.rb 
MyEngine::Engine.routes.draw do 
  #whatever 
end 

# parent_app/config/routes.rb 
ParentApp::Application.routes.draw do 
    mount MyEngine::Engine => "/engine", :as => "namespaced" 
end 

মডেল, নিয়ন্ত্রক ইত্যাদি পিতামাতার অ্যাপ্লিকেশন থেকে বিচ্ছিন্ন - যদিও সাহায্যকারীদের সহজেই ভাগ করা যায়।

এগুলিই আমি চিহ্নিত করেছি। সম্ভবত অন্য কেউ আছে? আমি এখানে জিজ্ঞাসা করেছি , কিন্তু এখনও একটি প্রতিক্রিয়া পাইনি ।

আমার ধারণাটি যেহেতু একটি পূর্ণ ইঞ্জিন প্যারেন্ট অ্যাপ্লিকেশন থেকে নিজেকে বিচ্ছিন্ন করে না, তাই এটি প্যারেন্ট অ্যাপ্লিকেশন সংলগ্ন স্ট্যান্ডেলোন অ্যাপ্লিকেশন হিসাবে সবচেয়ে বেশি ব্যবহৃত হয়। আমি বিশ্বাস করি নামের সংঘাত হতে পারে।

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

mount Cornerstone::Engine => "/cornerstone", :as => "help" 

আমি যদি আমার অনুমানের বাইরে চলে যাই তবে কেউ দয়া করে আমাকে জানান এবং আমি এই প্রতিক্রিয়াটি ঠিক করব। আমি এখানে চিয়ার্সটি সম্পর্কে একটি ছোট্ট নিবন্ধ তৈরি করেছি !


1
মাউন্ট অ্যাপ্লিকেশনটির মূলটিতে কোনও মাউন্টযোগ্য ইঞ্জিনটি কি কখনও রাউটেড / মাউন্ট করা যায়?
স্লিক 23

3
@JustinM আপনি চেষ্টা করে দেখতে পারেন mount MyEngine::Engine => "/"। এটি সংস্থানগুলির জন্য কাজ করে, সম্ভবত এটি ইঞ্জিনগুলির ক্ষেত্রেও।
বেনোইট গ্যারেট

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

39

দুটি অপশনই একটি ইঞ্জিন তৈরি করবে । পার্থক্যটি হ'ল --mountableইঞ্জিনটি একটি বিচ্ছিন্ন নেমস্পেসে --fullতৈরি করবে , অন্যদিকে এমন একটি ইঞ্জিন তৈরি করবে যা মূল অ্যাপ্লিকেশনটির নাম স্থানটি ভাগ করবে।

পার্থক্যগুলি তিনভাবে প্রকাশিত হবে:

1) ইঞ্জিন শ্রেণীর ফাইল কল করবে isolate_namespace:

lib / অনুপস্থিত my_full_engine / engine.rb:

module MyFullEngine
  class Engine < Rails::Engine
  end
end

lib / অনুপস্থিত my_mountable_engine / engine.rb:

module MyMountableEngine
  class Engine < Rails::Engine
    isolate_namespace MyMountableEngine # --mountable option inserted this line
  end
end

2) ইঞ্জিনের config/routes.rbফাইলটি নামগতির হবে:

সম্পূর্ণ ইঞ্জিন:

Rails.application.routes.draw do
end

মাউন্ট ইঞ্জিন:

MyMountableEngine::Engine.routes.draw do
end

3) কন্ট্রোলার, সহায়তাকারী, দর্শন এবং সম্পদগুলির জন্য ফাইলের কাঠামো নামগতির হবে:

অ্যাপ্লিকেশন / কন্ট্রোলার তৈরি / my_mountable_engine /application_controller.rb
অ্যাপ্লিকেশন / সাহায্যকারী / তৈরি my_mountable_engine /application_helper.rb
অ্যাপ্লিকেশন / মিলার তৈরি অ্যাপ্লিকেশন / মডেল তৈরি
অ্যাপ্লিকেশন / মতামত তৈরি / লেআউট / my_mountable_engine /application.html.erb
তৈরি অ্যাপ্লিকেশন / সম্পদ / ছবি / my_mountable_engine
অ্যাপ্লিকেশন / সম্পদ / স্টাইলশিটগুলি তৈরি করুন / my_mountable_engine /application.css
তৈরি করুন অ্যাপ / সম্পদ / জাভাস্ক্রিপ্ট / my_mountable_engine /application.js
তৈরি করুন কনফিগার / রুট.আরবি তৈরি করুন lib / my_mountable_engine.rb
তৈরি করুন lib / কার্য
/ আমার_মাউন্টযোগ্য_আজুন / সংস্করণ .rb
lib / my_mountable_engine / eng.rb তৈরি করুন


ব্যাখ্যা

--fullবিকল্পের জন্য ব্যবহারের ক্ষেত্রেটি খুব সীমাবদ্ধ বলে মনে হচ্ছে। ব্যক্তিগত জায়গাগুলি আমি নামের জায়গাটি আলাদা না করেই কেন আপনার কোডটিকে একটি ইঞ্জিনের সাথে আলাদা করতে চাইছি তার কোনও ভাল কারণ সম্পর্কে আমি ভাবতে পারি না It এটি আপনাকে কেবল দুটি দৃ applications়যুক্ত যুগল অ্যাপ্লিকেশনগুলি অভিন্ন ফাইল কাঠামো এবং সমস্ত দ্বন্দ্ব এবং কোড ফাঁস ভাগ করে নেবে যে আবশ্যক।

আমি যে ডকুমেন্টেশনের প্রতিটি অংশ দেখেছি সেগুলি --mountableবিকল্পটি প্রদর্শন করে এবং প্রকৃতপক্ষে বর্তমান প্রান্ত গাইড আপনাকে অন্তর্ভুক্ত করতে দৃ strongly়ভাবে উত্সাহিত করে isolate namespace- যা ব্যবহারের --mountableওভার বলার সমান --full

অবশেষে পরিভাষা বিভ্রান্তি রয়েছে: দুর্ভাগ্যক্রমে rails plugin -hনিম্নলিখিত বিবরণগুলি দেখায়:

[- পুরো] # পরীক্ষার জন্য বান্ডিলযুক্ত রেল অ্যাপ্লিকেশন সহ একটি রেল ইঞ্জিন তৈরি করুন
[- পরিমাণযোগ্য] # মাউন্টযোগ্য বিচ্ছিন্ন অ্যাপ্লিকেশন উত্পন্ন করুন

এটি এমন একটি ধারণা দেয় যে আপনি --full"ইঞ্জিন" --mountableতৈরি করতে এবং "মাউন্টেবল অ্যাপ্লিকেশন" নামক অন্য কিছু তৈরি করতে ব্যবহার করেন, যখন বাস্তবে তারা উভয় ইঞ্জিন - একটি নেমস্পিড এবং একটি নয়। এটি একটি বিভ্রান্তির দিকে পরিচালিত করতে বাধ্য কারণ ব্যবহারকারীরা ইঞ্জিন তৈরির সন্ধান করছেন সম্ভবত --fullএটি আরও প্রাসঙ্গিক বিকল্প বলে ধরে নেবে।

উপসংহার

  • rails plugin new something --full= আপনার অ্যাপ্লিকেশন এর নেমস্পেসে ইঞ্জিন। (েরগেরগ?)
  • rails plugin new something --mountable= এর নিজস্ব নামস্থান সহ ইঞ্জিন। (অসাধারণ)

তথ্যসূত্র


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

2
@ নাথানভদা - ঠিক আছে, তবে আমি মনে করি আপনি যদি একাধিক প্রকল্পের মধ্যে কিছু ভাগ করে নিচ্ছেন তবে এটির নাম স্পেস করা উচিত , কারণ আপনি মূলত এটি প্লাগইন হিসাবে ব্যবহার করছেন
ইয়ারিন

আমি মনে করি আপনি পুরো ফাইলটি ব্যবহার করতে চাইতে পারেন আপনি যদি আপনার ফাইলগুলি বিচ্ছিন্ন করতে চান, আপনার কল সাইটগুলির নামস্থান রাখুন যখন আপনি করেন Admin::AdminService.some_actionতবে আপনার রুটগুলি পরিবর্তন করতে হবে না যদি অন্য ক্লায়েন্ট সাইড অ্যাপ্লিকেশনগুলির মতো এম্বার অ্যাপ্লিকেশন আপনার কোডের সাথে সম্পর্কিত রুটগুলি ব্যবহার করে বিচ্ছিন্ন করতে চান - সম্পূর্ণ মনে হয় একটি মধ্যবর্তী পদক্ষেপ যা কার্যকর করা সহজ হতে পারে।
Jwan622

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

17

আমি একই ভাবছিলাম এবং তাই, এখানেই শেষ হয়েছিল। আমার কাছে মনে হয় যে পূর্ববর্তী উত্তরগুলি মূলত প্রশ্নটি কভার করে, তবে আমি ভেবেছিলাম নিম্নলিখিতগুলি পাশাপাশি সহায়তা করতে পারে:

# generate plugins (NOTE: using same name each time to minimize differences)
# -----------------------------------------------------------------------------

$ rails plugin new test-plugin -T
$ mv test-plugin{,.01}

$ rails plugin new test-plugin -T --mountable
$ mv test-plugin{,.02}

$ rails plugin new test-plugin -T --full
$ mv test-plugin{,.03}

$ rails plugin new test-plugin -T --full --mountable
$ mv test-plugin{,.04}




# compare "stock" (01) with "mountable" (02)
# -----------------------------------------------------------------------------

$ diff -r test-plugin.01 test-plugin.02

Only in test-plugin.02: app
Only in test-plugin.02: config
Only in test-plugin.02/lib/test-plugin: engine.rb
diff -r test-plugin.01/lib/test-plugin.rb test-plugin.02/lib/test-plugin.rb
0a1,2
> require "test-plugin/engine"
> 
Only in test-plugin.02: script
diff -r test-plugin.01/test-plugin.gemspec test-plugin.02/test-plugin.gemspec
18a19
>   # s.add_dependency "jquery-rails"




# compare "stock" (01) with "full" (03)
# -----------------------------------------------------------------------------

$ diff -r test-plugin.01 test-plugin.03
Only in test-plugin.03: app
Only in test-plugin.03: config
Only in test-plugin.03/lib/test-plugin: engine.rb
diff -r test-plugin.01/lib/test-plugin.rb test-plugin.03/lib/test-plugin.rb
0a1,2
> require "test-plugin/engine"
> 
Only in test-plugin.03: script
diff -r test-plugin.01/test-plugin.gemspec test-plugin.03/test-plugin.gemspec
18a19
>   # s.add_dependency "jquery-rails"




# compare "mountable" (02) with "full" (03)
# -----------------------------------------------------------------------------

$ diff -r test-plugin.02 test-plugin.03

Only in test-plugin.03/app/assets/javascripts/test-plugin: .gitkeep
Only in test-plugin.02/app/assets/javascripts/test-plugin: application.js
Only in test-plugin.03/app/assets/stylesheets/test-plugin: .gitkeep
Only in test-plugin.02/app/assets/stylesheets/test-plugin: application.css
Only in test-plugin.03/app/controllers: .gitkeep
Only in test-plugin.02/app/controllers: test-plugin
Only in test-plugin.03/app/helpers: .gitkeep
Only in test-plugin.02/app/helpers: test-plugin
Only in test-plugin.03/app/mailers: .gitkeep
Only in test-plugin.03/app/models: .gitkeep
Only in test-plugin.03/app/views: .gitkeep
Only in test-plugin.02/app/views: layouts
diff -r test-plugin.02/config/routes.rb test-plugin.03/config/routes.rb
1c1
< TestPlugin::Engine.routes.draw do
---
> Rails.application.routes.draw do
diff -r test-plugin.02/lib/test-plugin/engine.rb test-plugin.03/lib/test-plugin/engine.rb
3d2
<     isolate_namespace TestPlugin




# compare "mountable" (02) with "full & mountable" (04)
# -----------------------------------------------------------------------------

$ diff -r test-plugin.02 test-plugin.04

<no difference>




# compare "full" (03) with "full & mountable" (04)
# -----------------------------------------------------------------------------

$ diff -r test-plugin.03 test-plugin.04

Only in test-plugin.03/app/assets/javascripts/test-plugin: .gitkeep
Only in test-plugin.04/app/assets/javascripts/test-plugin: application.js
Only in test-plugin.03/app/assets/stylesheets/test-plugin: .gitkeep
Only in test-plugin.04/app/assets/stylesheets/test-plugin: application.css
Only in test-plugin.03/app/controllers: .gitkeep
Only in test-plugin.04/app/controllers: test-plugin
Only in test-plugin.03/app/helpers: .gitkeep
Only in test-plugin.04/app/helpers: test-plugin
Only in test-plugin.03/app/mailers: .gitkeep
Only in test-plugin.03/app/models: .gitkeep
Only in test-plugin.03/app/views: .gitkeep
Only in test-plugin.04/app/views: layouts
diff -r test-plugin.03/config/routes.rb test-plugin.04/config/routes.rb
1c1
< Rails.application.routes.draw do
---
> TestPlugin::Engine.routes.draw do
diff -r test-plugin.03/lib/test-plugin/engine.rb test-plugin.04/lib/test-plugin/engine.rb
2a3
>     isolate_namespace TestPlugin

বিশেষ আগ্রহ (আমার কাছে) হ'ল সত্যতা হল যে এর মধ্যে কোনও পার্থক্য নেই

rails plugin new test-plugin -T --mountable

এবং

rails plugin new test-plugin -T --full --mountable

সম্ভবত যে কারণে --fullঅগ্রাধিকার আছে --mountable?
মানকালাস

8

পার্থক্য সম্পর্কে আমার বোঝাটি হ'ল ইঞ্জিনগুলি প্লাগইনের মতো এবং বিদ্যমান অ্যাপ্লিকেশনগুলিতে কার্যকারিতা যুক্ত করে। যদিও মাউন্টযোগ্য অ্যাপ্লিকেশনগুলি মূলত একটি অ্যাপ্লিকেশন এবং একা দাঁড়িয়ে থাকতে পারে।

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


2

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

দাবি অস্বীকার: আমি, বেশিরভাগের মত, কেবল মাত্র ৩.১ রেলের সাথে টয়িং শুরু করেছি।


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