রেল ৩.১ ব্যবহার করে আপনি আপনার "পৃষ্ঠা নির্দিষ্ট" জাভাস্ক্রিপ্ট কোডটি কোথায় রাখবেন?


388

আমার বোঝার জন্য, আপনার সমস্ত জাভাস্ক্রিপ্ট 1 টি ফাইলে মিশে গেছে। //= require_tree .আপনার application.jsমেনিফেস্ট ফাইলের নীচে যুক্ত হওয়ার পরে রেলগুলি ডিফল্টরূপে এটি করে ।

এটিকে বাস্তব জীবন রক্ষাকারী বলে মনে হচ্ছে তবে আমি পৃষ্ঠা-নির্দিষ্ট জাভাস্ক্রিপ্ট কোডটি সম্পর্কে কিছুটা উদ্বিগ্ন। এই কোডটি কি প্রতিটি পৃষ্ঠায় কার্যকর করা হয়? আমি চাই সর্বশেষ জিনিসটি যখন আমার কেবলমাত্র 1 পৃষ্ঠায় প্রয়োজন হয় তখন আমার সমস্ত বস্তু প্রতিটি পৃষ্ঠার জন্য ইনস্ট্যান্ট করা হয়।

এছাড়াও, সংঘর্ষের কোডের সম্ভাবনা কি নেই?

অথবা আপনি scriptপৃষ্ঠার নীচে একটি ছোট ট্যাগ রেখেছেন যা কেবলমাত্র এমন পদ্ধতিতে কল করে যা পৃষ্ঠার জাভাস্ক্রিপ্ট কোড চালায়?

তখন কি আপনার আর দরকার নেই? জেএস দরকার?

ধন্যবাদ

সম্পাদনা : আমি সমস্ত উত্তরগুলির প্রশংসা করি ... এবং আমি মনে করি না যে তারা সত্যিই সমস্যাটি পেয়েছে। তাদের মধ্যে কিছু স্টাইলিং সম্পর্কিত এবং এটি সম্পর্কিত বলে মনে হচ্ছে না ... এবং অন্যরা কেবল উল্লেখ করেছে javascript_include_tag... যা আমি জানি যা বিদ্যমান (স্পষ্টতই ...) তবে এটি প্রদর্শিত হবে যে এগিয়ে যাওয়া রেলগুলি ৩.১ পথ সবগুলি মোড়ানো হয় is আপনার জাভাস্ক্রিপ্ট প্রতিটি পৃষ্ঠার নীচে পৃথক জাভাস্ক্রিপ্ট লোড না করে 1 ফাইলে।

আমি যে সর্বোত্তম সমাধানটি সামনে আসতে পারি তা হ'ল এস বা এস divসহ কিছু বৈশিষ্ট্যগুলিকে মোড়ানো w জাভাস্ক্রিপ্ট কোড, আপনি শুধু পরীক্ষা যদি বা পৃষ্ঠাতে হয়, এবং যদি তা না হয়, আপনি জাভাস্ক্রিপ্ট কোড এটি সঙ্গে যুক্ত করা হয় চালানো। এইভাবে যদি গতিশীল উপাদান পৃষ্ঠাটিতে না থাকে তবে জাভাস্ক্রিপ্ট কোডটি চলবে না - যদিও এটি স্প্রোককেটস দ্বারা প্যাকেজড বিশাল ফাইলের মধ্যে অন্তর্ভুক্ত করা হয়েছে ।idclassidclassapplication.js

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

আমি মনে করি এটিই আমার প্রশ্নের আসল উত্তর।


11
"রেলস ৩.১ এর এগিয়ে যাওয়ার উপায়টি হ'ল প্রতিটি পৃষ্ঠার নীচে পৃথক জাভাস্ক্রিপ্ট লোড করার পরিবর্তে আপনার সমস্ত জাভাস্ক্রিপ্টকে 1 ফাইলে গুটিয়ে রাখা to" - কেবলমাত্র রেল কোর দলটি বেকেস করুন এবং কীভাবে তা জেনে আসলেই খারাপ ছিল জাভাস্ক্রিপ্ট পরিচালনা করতে। ছোট ফাইলগুলি সাধারণত আরও ভাল (আমার মন্তব্য অন্যত্র দেখুন)। যখন জাভাস্ক্রিপ্টের কথা আসে, তখন রেলের উপায়টি খুব কমই সঠিক উপায়ে হয় (সম্পদ পাইপলাইন বাদে, যা গাধাটিকে লাথি দেয় এবং কফিস্ক্রিপ্টের উত্সাহ)।
মার্নেন লাইবো-কোসার

সুতরাং আপনি প্রতিটি পৃষ্ঠায় আপনার পৃষ্ঠা-নির্দিষ্ট js ফাইল অন্তর্ভুক্ত করবেন? আমি মনে করি এটি অপব্যয়, আমি ক্লোজারকয়বয়ের উত্তরটির সাথে আরও সম্মত।
ছিটিয়ে থাকা

1
আপনি কি এই প্রশ্নের স্বীকৃত উত্তরটি একবার দেখেছেন? stackoverflow.com/questions/6571753/...
rassom

1
@ ডটগ্রিআইএফএফ অন্য কথায়: না, এই ক্ষেত্রে রেলের উপায়গুলি করা ভাল নয় (বা কমপক্ষে সমস্ত কিছু don'tোকান না application.js), এবং প্রকৃতপক্ষে আপনি যে রেফারেন্স সরবরাহ করেছিলেন তা কেন এমন তা দেখায়: ডাউনলোডিং হ'ল জেএস কার্যকর করার প্রক্রিয়াটির ধীরতম অংশ। অনেক ছোট ফাইল একটি বড় ফাইলের চেয়ে বেশি ক্যাশেযোগ্য। অপরিষ্কার রেলগুলি ভাবেনা বলে মনে হয় না, তাদের সুপারিশগুলি যে নীতিগুলি মেনে চলার চেষ্টা করছেন তার সাথে অসামঞ্জস্যপূর্ণ এবং তাই তাদের সুপারিশগুলি গুরুত্ব সহকারে নেওয়া উচিত নয়।
মার্নেন লাইবো-কোসার

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

উত্তর:


157

সম্পদ পাইপলাইন ডকস নিয়ন্ত্রণকারী-নির্দিষ্ট জেএস কীভাবে করবেন তা পরামর্শ দেয়:

উদাহরণস্বরূপ, যদি একটি ProjectsControllerউৎপন্ন হয়, সেখানে এ একটি নতুন ফাইল হতে হবে app/assets/javascripts/projects.js.coffeeএবং আরেকটি app/assets/stylesheets/projects.css.scss। আপনার নিজের যে কোনও জাভাস্ক্রিপ্ট বা সিএসএসকে তাদের নিজ নিজ সম্পদ ফাইলের অভ্যন্তরে একটি নিয়ামকের কাছে অনন্য করা উচিত, কারণ এই ফাইলগুলি কেবল তখনই এই নিয়ন্ত্রণকারীদের যেমন লাইনযুক্ত <%= javascript_include_tag params[:controller] %>বা এর সাথে লোড করা যায় <%= stylesheet_link_tag params[:controller] %>

লিঙ্ক: সম্পদ_পইলাইন


50
এটি এটি করার জন্য সবচেয়ে মার্জিত উপায়। তবে এছাড়াও, আপনাকে লাইনটি // = প্রয়োজনীয়_ট্রি সরিয়ে ফেলতে হবে। অ্যাপ্লিকেশন.জেএসসি
কফি

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

2
আমি রিলে মোটামুটি নতুন, তবে আমার কাছে মনে হয় এটি ডিফল্ট আচরণ হওয়া উচিত।
রস হ্যামব্রিক

12
ক্রিয়া নির্দিষ্ট নিয়ন্ত্রণের জন্য আমার এটি আমার লেআউটে রয়েছে, কারণ প্রতিটি নিয়ামকের প্রতিটি ক্রিয়ায় নির্দিষ্ট জেএস থাকে না। page_specific_js = "#{params[:controller]}_#{params[:action]}"এবং তারপর; javascript_include_tag page_specific_js if Rails.application.assets.find_asset page_specific_js
সুজিমিচি

2
নিয়ামক নির্দিষ্ট ক্রিয়াগুলি এখনও খাটো করা হয়? তারা কি স্প্রোককেট দ্বারা তৈরি একক জেএস ফাইলটিতে যুক্ত হয়েছে, বা এ্যাসেট ফাইলগুলির জন্য একাধিক অনুরোধের দিকে পরিচালিত করে?
জেসন

77

পৃষ্ঠা-নির্দিষ্ট জেএসের জন্য আপনি গার্বার-আইরিশ সমাধান ব্যবহার করতে পারেন ।

সুতরাং আপনার রেল জাভাস্ক্রিপ্টস ফোল্ডারটি দুটি নিয়ামক - গাড়ি এবং ব্যবহারকারীদের জন্য এর মতো দেখতে পাওয়া যাবে:

javascripts/
├── application.js
├── init.js
├── markup_based_js_execution
├── cars
   ├── init .js
   ├── index.js
   └── ...
└── users
    └── ...

এবং জাভাস্ক্রিপ্টগুলি এর মতো দেখাবে:

// application.js

//= 
//= require init.js
//= require_tree cars
//= require_tree users

// init.js

SITENAME = new Object();
SITENAME.cars = new Object;
SITENAME.users = new Object;

SITENAME.common.init = function (){
  // Your js code for all pages here
}

// cars/init.js

SITENAME.cars.init = function (){
  // Your js code for the cars controller here
}

// cars/index.js

SITENAME.cars.index = function (){
  // Your js code for the index method of the cars controller
}

এবং চিহ্নিতআপ_বেসেড_জেএস_ এক্সিকিউশনে ইউটিআইএল অবজেক্টের জন্য এবং ডিওএম-প্রস্তুত UTIL.init সম্পাদনের কোড থাকবে execution

এবং এটি আপনার লেআউট ফাইলে রাখতে ভুলবেন না:

<body data-controller="<%= controller_name %>" data-action="<%= action_name %>">

আমি আরও মনে করি যে আরও data-*ভাল পৃষ্ঠা-নির্দিষ্ট সিএসএসের জন্য গুণাবলী পরিবর্তে ক্লাস ব্যবহার করা ভাল। জেসন গারবার যেমন উল্লেখ করেছেন: পৃষ্ঠা-নির্দিষ্ট সিএসএস নির্বাচকরা সত্যিই বিশ্রী হতে পারেন (যখন আপনি data-*বৈশিষ্ট্যগুলি ব্যবহার করেন )

আমি আশা করি এটা তোমাকে সাহায্য করবে।


4
আপনার যদি ব্যবহারকারী কন্ট্রোলারে সমস্ত ক্রিয়াকলাপের জন্য ভেরিয়েবলের প্রয়োজন হয় তবে অন্যান্য নিয়ামকগুলিতে উপলব্ধ না হয় তবে কী হবে? এই পদ্ধতিতে কিছু স্কোপিংয়ের সমস্যা নেই?
tybro0103

@ tybro0103, আমি মনে করি এই আচরণটি বাস্তবায়নের জন্য window.varForOneController='val'আপনি এই নিয়ামক আর ডি ফাংশনে কিছু লিখতে চাইবেন । এছাড়াও গন রত্ন এখানে সহায়তা করতে পারে ( github.com/gazay/gon )। অন্যান্য workaround হতে পারে।
ওয়েলদান97

1
@ ওয়েলডান ৯7 আপনার ব্যাখ্যাটির জন্য তীব্র নয় - যা দুর্দান্ত - তবে গার্বার-আইরিশ কাঠামোটি খারাপ। এটি প্রতিটি পৃষ্ঠায় আপনার সমস্ত জেএস লোড করে এবং জিনিসগুলি বাছাই করার জন্য <body> উপাদানগুলিতে শ্রেণি এবং আইডির উপর নির্ভর করে। এটি ডিওএমের সাথে লড়াইয়ের একটি নিশ্চিত নিদর্শন: সাধারণ পরিস্থিতিতে <body> উপাদানটির কোনও শ্রেণি বা আইডি লাগবে না, যেহেতু নথিতে কেবল একটিই আছে। এটি করার সঠিক উপায়টি কেবল //= require_tree .পৃষ্ঠা-নির্দিষ্ট জাভাস্ক্রিপ্ট সরিয়ে এবং ব্যবহার করা। আপনি যদি সক্রিয়ভাবে এটি না করার চেষ্টা করছেন তবে আপনি খারাপ অভ্যাসের জন্য চেষ্টা করছেন।
মার্নেন লাইবো-কোসার

2
@ মার্নেনলাইবো-কোসার ব্যক্তিগতভাবে আমি বিশ্বাস করি যে আপনি যখন সমস্ত ফাইলকে একটি ফাইলে একত্রিত করেন এবং এটি হ্রাস করেন তখন প্রতিটি পৃষ্ঠায় সমস্ত জেএস লোড করা বেশিরভাগ প্রকল্পের জন্য ভাল। আমি বিশ্বাস করি এটি সামগ্রিকভাবে ব্যবহারকারীর জন্য দ্রুত কাজ করে। অন্তত এটির মতবিরোধের মতো আরও একটি জেএস ফাইল বনাম অনেকগুলি (উদাহরণস্বরূপ স্ট্যাকওভারফ্লো . com/ প্রশ্নগুলি / 555696/… দেখুন )। এছাড়াও কোডটি সহজ করে তোলে এবং আপনার জন্য কাজ করে তবে শরীরে ক্লাস এবং আইডি ব্যবহারে খারাপ কিছু নেই। মডার্নিজার ( মডার্নিজার.কম ) এটি করে এবং অন্যান্য কিছু লিওবসও করে।
ওয়েলদান97

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

65

আমি দেখতে পাচ্ছি যে আপনি নিজের প্রশ্নের উত্তর দিয়েছেন, তবে এখানে আরও একটি বিকল্প রয়েছে:

মূলত, আপনি এই ধারণাটি তৈরি করছেন

//= require_tree .

দরকার. এটা না। এটি অপসারণ নির্দ্বিধায়। আমার বর্তমান অ্যাপ্লিকেশনটিতে, আমি প্রথমে 3.1.x দিয়ে সততার সাথে করছি, আমি তিনটি পৃথক শীর্ষ স্তরের জেএস ফাইল তৈরি করেছি। আমার application.jsফাইলটি কেবল আছে

//= require jquery
//= require jquery_ujs
//= require_directory .
//= require_directory ./api
//= require_directory ./admin

এইভাবে, আমি তাদের নিজস্ব শীর্ষ স্তরের জেএস ফাইল সহ সাব-ডিরেক্টরিগুলি তৈরি করতে পারি, এতে কেবল আমার যা প্রয়োজন তা অন্তর্ভুক্ত।

কীগুলি হ'ল:

  1. আপনি মুছে ফেলতে পারেন require_tree- রেলগুলি আপনাকে এটি করা অনুমানগুলি পরিবর্তন করতে দেয়
  2. নাম সম্পর্কে বিশেষ কিছুই নেই application.js- assets/javascriptউপ-ডিরেক্টরিতে যে কোনও ফাইলের সাথে প্রসেসর প্রসেসরের নির্দেশাবলী অন্তর্ভুক্ত থাকতে পারে//=

আশা করি এটি ক্লোজারকউবয়ের উত্তরে কিছু বিশদ সহায়তা করে এবং যুক্ত করে।

Sujal


8
+1 আমার মতো নবজাতকের পক্ষে এটি জানতে পেরে দুর্দান্ত। আমি পারলে +2 দিতাম।
jrhorn424

5
@ সুজাল ঠিক রেলস কোর টিম অতিমাত্রায় জাভাস্ক্রিপ্ট পরিচালনার জন্য কুখ্যাত। তাদের পরামর্শগুলি উপেক্ষা করার জন্য নির্দ্বিধায় এবং কেবল সম্পদ পাইপলাইনের ভাল অংশগুলি ব্যবহার করুন । :)
মার্নেন লাইবো-কোসার

1
এই পরামর্শের জন্য অনেক ধন্যবাদ। আমার অ্যাপ্লিকেশনটির মডিউলটির উপর নির্ভর করে আমার কাছে বেশ কয়েকটি "শীর্ষ-স্তরের" জেএস ফাইল নেই। ভাল কাজ করে.
Elsurudo

1
এখানে আমার জন্য +1 গুরুত্বপূর্ণ পয়েন্ট যে আপনি প্রতিস্থাপন করতে পারেন হয় //= require_tree .সঙ্গে //= require_directory .যাতে আপনি তারা কোথায় এবং পৃষ্ঠার নির্দিষ্ট ফাইলের জন্য নতুন ডিরেক্টরি তৈরি সমস্ত বিদ্যমান ফাইল রাখতে পারবেন না।
জেলানিক্স

41

অন্য বিকল্প: পৃষ্ঠা তৈরি করতে বা মডেল-নির্দিষ্ট ফাইলগুলি তৈরি করতে আপনি আপনার assets/javascripts/ফোল্ডারের ভিতরে ডিরেক্টরি তৈরি করতে পারেন ।

assets/javascripts/global/
assets/javascripts/cupcakes
assets/javascripts/something_else_specific

আপনার প্রধান application.jsমেনিফেস্ট ফাইলটি এর ফাইলগুলি লোড করার জন্য কনফিগার করা যেতে পারে global/। নির্দিষ্ট পৃষ্ঠাগুলি বা পৃষ্ঠাগুলির গোষ্ঠীর নিজস্ব প্রকাশ হতে পারে যা তাদের নিজস্ব নির্দিষ্ট ডিরেক্টরি থেকে ফাইল লোড করে। স্প্রোকেটগুলি স্বয়ংক্রিয়ভাবে লোড হওয়া ফাইলগুলি application.jsআপনার পৃষ্ঠা-নির্দিষ্ট ফাইলগুলির সাথে একত্রিত করবে , যা এই সমাধানটিকে কাজ করতে দেয়।

এই কৌশলটি style_sheets/পাশাপাশি ব্যবহার করা যেতে পারে ।


13
তুমি আমাকে এখন কাপকেকের অভ্যাস করিয়েছ .. ডাঙ্গিত!
চক বার্গারন

আমি এই সমাধানটি সত্যিই পছন্দ করি। আমার কেবল সমস্যাটি হ'ল those অতিরিক্ত প্রকাশগুলি সংকুচিত / uglified নয়। সেগুলি যদিও সঠিকভাবে সংকলিত হয়। কোন সমাধান আছে বা আমি কিছু মিস করছি?
clst

1
এর অর্থ কি ব্রাউজারটি একটি জেএস ফাইল লোড করে, এটি গ্লোবাল + পৃষ্ঠা নির্দিষ্ট ফাইলের সংমিশ্রণ?
লুলালালা

আপনি যদি পাওয়া যায় তবে আমার প্রশ্নটি একবার দেখে নিতে পারেন? stackoverflow.com/questions/17055213/…
ম্যাক্সিমাস এস

1
@ ক্লাস্ট আমি বিশ্বাস করি যে এটিই আপনি উত্তরটি খুঁজছেন: গাইডস
ফ্রন্টিয়ারপাইকো

23

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

আমি যে সর্বোত্তম সমাধানটি সামনে আসতে পারি তা হ'ল এস বা এস divসহ কিছু বৈশিষ্ট্যগুলিকে মোড়ানো w জাভাস্ক্রিপ্ট কোড। তারপর আপনি শুধু পরীক্ষা যদি বা পৃষ্ঠাতে হয়, এবং যদি তা না হয়, আপনি যে এটা সঙ্গে যুক্ত করা হয় জাভাস্ক্রিপ্ট কোড চালানো। এইভাবে যদি গতিশীল উপাদান পৃষ্ঠাতে না থাকে তবে জাভাস্ক্রিপ্ট কোডটি চলবে না - যদিও এটি বিশাল আকারের মধ্যে অন্তর্ভুক্ত করা হয়েছেidclassidclassapplication.js স্প্রোককেটস দ্বারা প্যাকেজড ফাইলের ।

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

আমি মনে করি এটিই আমার প্রশ্নের আসল উত্তর।


তবে আপনি আসলে সেই ম্যানুয়াল <script>ট্যাগগুলি চান । হ্যাঁ, ক্লাস এবং আইডিগুলি উত্তরের অংশ, তবে জাভা স্ক্রিপ্ট লোড করা ব্যবহারকারীর পক্ষে সেই নির্দিষ্ট পৃষ্ঠার প্রয়োজন হয় না তা বোঝায় না।
মার্নেন লাইবো-কোসার

4
@ মার্নেনলাইবো-কোসার প্রতিটি অনন্য পৃষ্ঠায় ম্যানুয়াল স্ক্রিপ্ট ট্যাগগুলি যুক্ত না করার কারণ হ'ল আপনাকে প্রতিটি পৃষ্ঠাগুলিতে সেই স্ক্রিপ্ট সামগ্রীটি ডাউনলোড করতে হবে। আপনি যদি সম্পদ পাইপলাইন ব্যবহার করে অ্যাপ্লিকেশন.জেজে সমস্ত জাভাস্ক্রিপ্ট প্যাকেজ করতে সক্ষম হন তবে ব্যবহারকারী সেই স্ক্রিপ্টগুলি কেবল একবার একবার ডাউনলোড করে, এবং পরবর্তী
পৃষ্ঠাগুলির

@ জাকাওনরইলস "প্রতিটি অনন্য পৃষ্ঠায় ম্যানুয়াল স্ক্রিপ্ট ট্যাগগুলি না যুক্ত করার কারণটি হ'ল আপনাকে সেই স্ক্রিপ্ট সামগ্রীটি প্রতিটি পৃষ্ঠার ভিউতে ডাউনলোড করতে হবে" - বেশ ভুল। স্ক্রিপ্টটি একবার ডাউনলোড করা হবে, তারপরে আরও অনুরোধে ব্রাউজারের ক্যাশে থেকে আনা হবে। "আপনি যদি সম্পদ পাইপলাইন ব্যবহার করে অ্যাপ্লিকেশন.জেজে সমস্ত জাভাস্ক্রিপ্ট প্যাকেজ করতে সক্ষম হন তবে ব্যবহারকারী কেবল একবার স্ক্রিপ্টগুলি ডাউনলোড করে" —আরউ, তবে প্রচুর অপ্রয়োজনীয় কোডের বিনিময়ে। যদি আপনি আপনার জেএসকে একটি বড় ফাইলের পরিবর্তে অনেকগুলি ছোট ফাইলে গঠন করতে পারেন তবে আপনি অপ্রয়োজনীয় কোড ছাড়াই ক্যাশে সুবিধা পাবেন।
মার্নেন লাইবো-কোসার

1
@ মার্নেনলাইবো-কোসার আমি মনে করি এটি বলাই ভাল হত যে আপনি যদি সমস্ত কিছু একটি স্ক্রিপ্টে প্যাকেজ করেন তবে আপনার ব্যবহারকারীকে কেবল আপনার সাইটের কোনও পৃষ্ঠার জন্য 1 স্ক্রিপ্ট ডাউনলোড করতে হবে। আপনার অ্যাপ্লিকেশনের বিভিন্ন অংশের জন্য যদি একাধিক স্ক্রিপ্ট থাকে তবে অবশ্যই ব্যবহারকারীকে একাধিক স্ক্রিপ্ট ডাউনলোড করতে হবে। উভয় পদ্ধতি অবশ্যই ক্যাশে করা হবে, তবে বেশিরভাগ ক্ষেত্রে (ছোট-মাঝারি অ্যাপ্লিকেশন), একটি অ্যাপ্লিকেশনকে সরবরাহ করা j আপনি কী পরিবেশন করেন তার উপর নির্ভর করে জেএসকে পার্সিং করা অন্য গল্প হতে পারে।
jakeonrails

1
@ জিগজি এছাড়াও, ছোট ফাইলটি যদি 100 পৃষ্ঠার মধ্যে 8 টিতে ব্যবহার করা হয় তবে কোডটি কেন সমস্ত সময় ব্যবহারকারীর ক্যাশে বসে থাকবে? যে জিনিসগুলি প্রয়োজন হয় না তা আসলে ফেলে দেওয়া ভাল।
মার্নেন লাইবো-কোসার

16

আমি বুঝতে পারি যে আমি এই পার্টিতে কিছুটা দেরি করছি, তবে আমি এমন একটি সমাধান ফেলতে চেয়েছিলাম যা আমি ইদানীং ব্যবহার করেছি। যাইহোক, আমি প্রথমে উল্লেখ করা যাক ...

Ails.১ / ৩.২ রাস্তাটি (না, স্যার। আমি এটি পছন্দ করি না)

দেখুন: http://guides.rubyonrails.org/asset_pipline.html#how-to-use-the-setset-pipline

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

অনুরোধ করা এই প্রশ্নের মূল লেখক হিসাবে দর্শন-ওরিয়েন্টেড না হয়ে "রেলস ওয়ে" একটি নিয়ামক-ভিত্তিক সমাধান। সেখানে নিয়ামক-নির্দিষ্ট জেএস ফাইলগুলি তাদের নিজ নিজ নিয়ন্ত্রকের নামে নামকরণ করেছে। এই সমস্ত ফাইলের একটি ফোল্ডার ট্রিতে স্থাপন করা হয়েছে যা অ্যাপ্লিকেশনের কোনওটিতে ডিফল্টরূপে অন্তর্ভুক্ত নেই .js নির্দেশনার প্রয়োজন।

নিয়ামক-নির্দিষ্ট কোড অন্তর্ভুক্ত করতে, নিম্নলিখিতটিতে একটি দর্শন যোগ করা হয়েছে।

<%= javascript_include_tag params[:controller] %>

আমি এই সমাধানটিকে ঘৃণা করি, তবে এটি সেখানে এবং দ্রুত। সম্ভবত, আপনি পরিবর্তে এই ফাইলগুলিকে "people-index.js" এবং "people-show.js" এর মতো কিছু বলতে পারেন এবং তারপরে "#{params[:controller]}-index"একটি ভিউ-ওরিয়েন্টেড সমাধান পাওয়ার মতো কিছু ব্যবহার করতে পারেন । আবার, দ্রুত স্থির করুন, তবে এটি আমার সাথে ভালভাবে বসে না।

আমার ডেটা অ্যাট্রিবিউট ওয়ে

আমাকে পাগল বলুন, তবে আমি যখন নিযুক্ত থাকি তখন আমার সমস্ত জেএস কম্পাইল করে অ্যাপ্লিকেশন.জেজে মাইন্ড করা উচিত। এই ছোট্ট স্ট্রাগলার ফাইলগুলি পুরো জায়গাতেই অন্তর্ভুক্ত করতে আমি মনে রাখতে চাই না।

আমি আমার সমস্ত জেএসকে একটি কমপ্যাক্টে, শীঘ্রই হতে যাওয়া ব্রাউজারের ক্যাশেড, ফাইলে লোড করি। যদি আমার অ্যাপ্লিকেশন.জেএস এর কোনও নির্দিষ্ট টুকরোটি কোনও পৃষ্ঠায় ফায়ার করা দরকার হয়, আমি এইচটিএমএলকে বলি, রেলগুলি নয়।

আমার জেএসকে নির্দিষ্ট উপাদান আইডিতে লক করা বা মার্কার ক্লাসগুলির সাথে আমার এইচটিএমএল লিটারের পরিবর্তে, আমি একটি কাস্টম ডেটা অ্যাট্রিবিউট ব্যবহার করি data-jstags

<input name="search" data-jstag="auto-suggest hint" />

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

  1. চিহ্নিত ডিওমে থাকা সমস্ত উপাদানগুলির উপরে আইট্রেট করুন data-jstag
  2. প্রতিটি উপাদানের জন্য, ট্যাগ স্ট্রিংগুলির একটি অ্যারে তৈরি করে স্পেসে অ্যাট্রিবিউট মানটি ভাগ করুন।
  3. প্রতিটি ট্যাগ স্ট্রিংয়ের জন্য, সেই ট্যাগের জন্য একটি হ্যাশে একটি অনুসন্ধান করুন।
  4. যদি কোনও মিলে যাওয়া কীটি পাওয়া যায় তবে উপাদানটিকে প্যারামিটার হিসাবে পাস করে এর সাথে যুক্ত ফাংশনটি চালান।

সুতরাং বলুন যে আমি আমার অ্যাপ্লিকেশন.জেএস-এ কোথাও নিচের সংজ্ঞা দিয়েছেন:

function my_autosuggest_init(element) {
  /* Add events to watch input and make suggestions... */
}

function my_hint_init(element) {
  /* Add events to show a hint on change/blur when blank... */
  /* Yes, I know HTML 5 can do this natively with attributes. */
}

var JSTags = {
  'auto-suggest': my_autosuggest_init,
  'hint': my_hint_init
};

বুটস্ট্র্যাপিং ঘটনা প্রয়োগ করতে যাচ্ছে my_autosuggest_initএবংmy_hint_init অনুসন্ধানের ইনপুটটির বিপরীতে কার্যগুলি , এটি একটি ইনপুট হিসাবে রূপান্তর করবে যা ব্যবহারকারীর ধরণের সময় প্রস্তাবনার তালিকাকে প্রদর্শন করে, পাশাপাশি ইনপুটটি ফাঁকা এবং ফোকাসবিহীন অবস্থায় রেখে কিছু প্রকারের ইনপুট ইঙ্গিত প্রদান করে।

কিছু উপাদান ট্যাগ করা না হলে data-jstag="auto-suggest" না থাকলে স্বয়ংক্রিয়-পরামর্শ কোডটি কখনই জ্বলে না। যাইহোক, এটি সর্বদা সেখানে থাকে, সর্বনিম্ন হয় এবং অবশেষে আমার অ্যাপ্লিকেশনটিতে ক্যাশে থাকে times সময়ের জন্য আমার কোনও পৃষ্ঠায় এটি প্রয়োজন।

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

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

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


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

: যে সংকলন পদক্ষেপ আমি যে বিষয়ে কথা বলছি ব্যবহারিক প্রভাব আরো জানার জন্য, কীভাবে pjax প্রভাব Basecamp পরবর্তী 37 সংকেত 'ব্যাখ্যা দেখুন 37signals.com/svn/posts/...
sujal

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

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

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

7

এটির উত্তর দেওয়া হয়েছে এবং অনেক আগেই গৃহীত হয়েছে, তবে আমি এর কয়েকটি উত্তর এবং রেল 3+ এর সাথে আমার অভিজ্ঞতার ভিত্তিতে আমার নিজের সমাধান নিয়ে এসেছি।

সম্পদ পাইপলাইন মিষ্টি। এটা ব্যবহার করো.

প্রথমে আপনার application.jsফাইলে, সরান//= require_tree.

তারপরে আপনার application_controller.rbসহায়তার পদ্ধতি তৈরি করুন:

helper_method :javascript_include_view_js //Or something similar

def javascript_include_view_js
    if FileTest.exists? "app/assets/javascripts/"+params[:controller]+"/"+params[:action]+".js.erb"
        return '<script src="/assets/'+params[:controller]+'/'+params[:action]+'.js.erb" type="text/javascript"></script>'
    end
end

তারপরে আপনার application.html.erbলেআউট ফাইলটিতে বিদ্যমান জাভাস্ক্রিপ্ট অন্তর্ভুক্ত থাকা সহ নতুন নতুন সহায়কটি সহায়কটির সাথে উপসর্গযুক্ত করে যুক্ত করুন raw:

<head>
    <title>Your Application</title>
    <%= stylesheet_link_tag "application", :media => "all" %>
    <%= javascript_include_tag "application" %>
    <%= raw javascript_include_view_js %>
</head>

ভয়েলা, এখন আপনি রেলের যে কোনও জায়গায় ব্যবহার করেন একই ফাইল স্ট্রাকচারটি ব্যবহার করে সহজেই দৃশ্য-নির্দিষ্ট জাভাস্ক্রিপ্ট তৈরি করতে পারেন। কেবল আপনার ফাইলগুলিকে আটকে দিন app/assets/:namespace/:controller/action.js.erb!

আশা করি যে অন্য কাউকে সাহায্য করবে!


1
সম্পদ প্রাক্পম্পাইলেড হওয়ার পরে এবং সমস্যাটি কি চালানোর সময় <%= raw ... %>404 ফেরত দেবে?
নিশান্ত

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

1
@ দেবোরাহস্পীস সম্পদ পাইপলাইন কখন এমন ফাইল তৈরি করে যা ব্যবহার করা উচিত নয়? আপনি কি require_tree /(খারাপ) সাথে সম্পদ পাইপলাইন (ভাল) গুলিয়ে ফেলছেন ?
মার্নেন লাইবো-কোসার

6

আপনি নিয়ামক নির্দিষ্ট জাভাস্ক্রিপ্ট ফাইল স্বয়ংক্রিয়ভাবে লোড করতে আপনার লেআউট ফাইলটিতে (যেমন অ্যাপ্লিকেশন html.erb) এই লাইনটি যুক্ত করতে পারেন (আপনি যখন নিয়ামক তৈরি করার সময় তৈরি হয়েছিল):

<%= javascript_include_tag params[:controller] %>

আপনি প্রতি-ক্রিয়া ভিত্তিতে একটি স্ক্রিপ্ট ফাইল স্বয়ংক্রিয়ভাবে লোড করতে একটি লাইনও যুক্ত করতে পারেন।

<%= javascript_include_tag params[:controller] + "/" + params[:action] %>

আপনার পৃষ্ঠার স্ক্রিপ্টগুলি কেবলমাত্র নিয়ামকের নাম অনুসারে একটি সাবডাইরেক্টরিয়ে রেখে দিন। এই ফাইলগুলিতে আপনি = প্রয়োজন ব্যবহার করে অন্যান্য স্ক্রিপ্টগুলি অন্তর্ভুক্ত করতে পারেন। ব্রাউজারে 404 ব্যর্থতা এড়াতে কেবল ফাইলটি উপস্থিত থাকলে অন্তর্ভুক্ত করার জন্য সহায়ক তৈরি করা ভাল।


6
<%= javascript_include_tag params[:controller] %>

2
দেখে মনে হচ্ছে এটি প্রশ্নের উত্তর দিতে সক্ষম হতে পারে। আপনি কি দয়া করে উত্তরের উত্তরটি আরও যুক্ত করতে পারেন?


5

LoadJS মণি অন্য কোনো বিকল্প নেই:

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

https://github.com/guidomb/loadjs


3

ফিলিপের উত্তর বেশ ভাল। এটি কার্যকর করতে কোডটি এখানে:

অ্যাপ্লিকেশন html.erb এ:

<body class="<%=params[:controller].parameterize%>">

আপনার নিয়ামককে ধরে নেওয়া হচ্ছে প্রকল্পগুলি বলা হয়, যা উত্পন্ন করবে:

<body class="projects">

তারপরে প্রজেক্টে.জেএসসি কফি:

jQuery ->
  if $('body.projects').length > 0  
     $('h1').click ->
       alert 'you clicked on an h1 in Projects'

ডাউনভোটিং: যে কোনও সমাধান যা ক্লাস স্থাপন করে <body>তা আইপসো ফ্যাক্টোটি ভুল। আমার মন্তব্য এই পৃষ্ঠায় অন্য কোথাও দেখুন।
মার্নেন লাইবো-কোসার

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

2

জাভাস্ক্রিপ্টগুলি কেবল তখন মার্জ করা হবে যখন আপনি রেলগুলি (স্প্রোককেট, বরং) তাদের মার্জ করতে বলবেন।


অবশ্যই. আমার ধারণা আমি জিজ্ঞাসা করেছি কারণ রেলের ডিফল্টগুলিতে ফোল্ডারে সমস্ত কিছুই অন্তর্ভুক্ত থাকে ... যার অর্থ ডেভিড আপনার এটি করার ইচ্ছা করে। তবে আমি @ রবিপ্রিন্সের কাছে অন্য মন্তব্যে যেমন বলেছিলাম, এভাবে কাজটি করা হয় তখন আমি মৃত্যুদণ্ডের বিষয়ে নিশ্চিত নই। আমি ভাবছি আমাকে অক্ষম করতে হবে //= require_tree .?
ফায়ার প্রতীক 13

@ ফায়ারএম্বলেম হ্যাঁ require_tree .সাধারণত একটি খারাপ ধারণা।
মার্নেন লাইবো-কোসার

2

আমি এভাবেই স্টাইলিংয়ের সমস্যাটি সমাধান করেছি: (হামলাকে ক্ষমা করুন)

%div{:id => "#{params[:controller].parameterize} #{params[:view]}"}
    = yield

এইভাবে আমি সমস্ত পৃষ্ঠার সাথে নির্দিষ্ট .css.sass ফাইলগুলি শুরু করব:

#post
  /* Controller specific code here */
  &#index
    /* View specific code here */
  &#new
  &#edit
  &#show

এইভাবে আপনি সহজেই কোনও সংঘাত এড়াতে পারবেন। যখন .js.c কফি ফাইলগুলির কথা আসে তখন আপনি কেবলমাত্র উপাদানগুলির সূচনা করতে পারেন;

$('#post > #edit') ->
  $('form > h1').css('float', 'right')

আশা করি এটি কিছুটা সাহায্য করেছে।


1
শেষ বিটটি আবার পড়ুন দয়া করে, জাভাস্ক্রিপ্টের জন্য আপনি স্টাইলশিটগুলির জন্য নির্দিষ্ট কাঠামোগুলি দেখতে আরম্ভ করার জন্য একই কাঠামোর সুবিধা নিতে পারেন।
জিরাউ

ফিলিপ, $('#post > #edit') ->অবৈধ বলে মনে হচ্ছে। আপনি কীভাবে একটি সুযোগের মধ্যে কাজ করতে jQuery সুযোগ করবেন?
রমন তাইগ

2
সম্প্রতি আমি এই অ্যাপ্লিকেশনটিতে কল করে সমস্ত নিয়ামক নির্দিষ্ট জাভা স্ক্রিপ্ট এবং স্টাইল শীট লোড করা শুরু করেছি; = javascript_include_tag "application"এবং = javascript_include_tag params[:controller]এইভাবে আমি জাভাস্ক্রিপ্ট কোডটি ফাইলের অভ্যন্তরে কোনও ক্ষেত্র নির্দিষ্ট না করেই সীমাবদ্ধ রাখতে পারি।
জীরাউ

2

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


2

আমি আপনার উত্তরের সাথে একমত হয়েছি, সেই নির্বাচক আছে কিনা তা পরীক্ষা করতে, ব্যবহার করুন:

if ($(selector).length) {
    // Put the function that does not need to be executed every page
}

(কেউ আসল সমাধান যোগ করতে দেখেনি)


2

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

উদাহরণ সম্পাদনা

সম্পদ / জাভাস্ক্রিপ্ট / অ্যাপ্লিকেশন.জেএস

//= require jquery
//= require jquery_ujs
//= require lodash.underscore.min
...


ভিউ / লেআউট / অ্যাপ্লিকেশন। html.erb

  ...
  </footer>

  <!-- Javascripts ================================================== -->
  <!-- Placed at the end of the document so the pages load faster -->
  <%= javascript_include_tag "application" %>
  <%= yield :javascript %>

</body>
</html>


ভিউ / foo / সূচক। html.erb

...
<% content_for :javascript do %>
  <%= javascript_include_tag params[:controller] %>
<% end %>


সম্পদ / জাভাস্ক্রিপ্ট / foo.js

//= require moment
//= require_tree ./foostuff


সম্পদ / জাভাস্ক্রিপ্ট / foostuff / foothis.js.c কফি

alert "Hello world!"


সংক্ষিপ্ত বর্ণনা

  • অ্যাপ্লিকেশন.জেগুলি//= require_tree . থেকে সরান এবং প্রতিটি পৃষ্ঠায় ভাগ করা কেবল জেএস তালিকাবদ্ধ করুন।

  • অ্যাপ্লিকেশন। Html.erb এ উপরের দুটি রেখা দেখানো হয়েছে কোথায় অ্যাপ্লিকেশন.জেস এবং আপনার পৃষ্ঠা-নির্দিষ্ট জেএস অন্তর্ভুক্ত করা উচিত page

  • উপরের তিনটি লাইন ইনডেক্সHtml.erb এ দেখানো হয়েছে যা আপনাকে কিছু পৃষ্ঠা-নির্দিষ্ট জেএস সন্ধান করতে এবং ": জাভাস্ক্রিপ্ট" (অথবা আপনি যে নামটি দিয়ে যেতে চান) নামক একটি ফলন অঞ্চলে অন্তর্ভুক্ত করতে বলেছেন। এই উদাহরণে, নিয়ামকটি "foo" তাই রেয়েলগুলি "foo.js" এ অন্তর্ভুক্ত করার চেষ্টা করবে: অ্যাপ্লিকেশন বিন্যাসে জাভাস্ক্রিপ্ট ফলন অঞ্চল।

  • আপনার পৃষ্ঠা-নির্দিষ্ট জেএসকে foo.js (অথবা যে কোনও নিয়ামকের নাম দেওয়া হয়েছে) তালিকাভুক্ত করুন । সাধারণ লাইব্রেরি, একটি গাছ, ডিরেক্টরিগুলি, যাই হোক না কেন তালিকাবদ্ধ করুন।

  • আপনার কাস্টম পৃষ্ঠা-নির্দিষ্ট জেএসকে এমন কোনও জায়গায় রাখুন যেখানে আপনি সহজেই আপনার অন্যান্য কাস্টম জেএস থেকে আলাদা করে রেফারেন্স করতে পারেন। এই উদাহরণে, foo.js এর জন্য foostuff ট্রি প্রয়োজন তাই আপনার কাস্টম জেএসকে এখানে রাখুন, যেমন foothis.js.c کافی

  • এখানে কোনও কঠোর নিয়ম নেই। জিনিসগুলি চারপাশে সরানো নির্দ্বিধায় এবং প্রয়োজনে বিভিন্ন লেআউটে বিভিন্ন নামের একাধিক ফলন অঞ্চলও তৈরি করতে পারে। এটি কেবলমাত্র একটি সম্ভাব্য প্রথম ধাপ এগিয়ে দেখায়। (আমি আমাদের ব্যাকবোন.জেএসএসের ব্যবহারের ভিত্তিতে এটি ঠিক তেমন করি না f আমি foo.js কেও ফুস্টফের পরিবর্তে ফু নামে একটি ফোল্ডারে ফেলতে পছন্দ করতে পারি তবে এখনও এটি সিদ্ধান্ত নেয়নি))

মন্তব্য

আপনি সিএসএস এবং এর সাথে একই জিনিস করতে পারেন <%= stylesheet_link_tag params[:controller] %> এটি প্রশ্নের সুযোগের বাইরে।

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


এটি যাবার উপায়ের মতো দেখায়, আমি দেখতে যাচ্ছি যে আমি এটি নিজের অ্যাপ্লিকেশনটিতে প্রয়োগ করতে পারি কিনা, বিস্তারিত উত্তরের জন্য ধন্যবাদ।
martincarlin87

1

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

$(document).ready(function() {
   if(window.location.pathname.indexOf('/yourpage') != -1) {
          // the javascript you want to execute
   }
}

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


1

রিগুইয়ের উত্তরটি একটি উত্তরের উত্তর, যদিও এটি নেতিবাচক পয়েন্টের জমিতে ডাউনভোট হয়ে গেছে।

বিশেষত যদি আপনি ব্যাকবোন জেএস এর মতো কিছু ব্যবহার করেন - প্রতিটি পৃষ্ঠার নিজস্ব ব্যাকবোন ভিউ রয়েছে। তারপরে এরিবি ফাইলটিতে কেবল ইনলাইন জাভাস্ক্রিপ্টের একক লাইন রয়েছে যা ডান পিছনের দিকের ভিউ ক্লাসে জ্বালিয়ে দেয়। আমি এটিকে 'আঠালো কোড' এর একক লাইন হিসাবে বিবেচনা করি এবং এর ফলে এটির ইনলাইন ঠিক আছে। সুবিধাটি হ'ল আপনি আপনার "প্রয়োজনীয়_ট্রি" রাখতে পারেন যা ব্রাউজারটিকে সমস্ত জাভাস্ক্রিপ্ট ক্যাশে করতে দেয়।

show.html.erb এ, আপনার মতো কিছু থাকবে:

<% provide :javascript do %>
  <%= javascript_include_tag do %>
    (new app.views.ProjectsView({el: 'body'})).render();
  <% end %>
<% end do %>

এবং আপনার লেআউট ফাইলটিতে আপনার প্রয়োজন:

<%= yield :javascript %>

Downvoting। ইনলাইন জাভাস্ক্রিপ্ট কখনও ভাল ধারণা হয় না। এমনকি এটি আঠালো কোড হলেও এটি কোনও বাহ্যিক ফাইলে থাকা উচিত।
মার্নেন লাইবো-কোসার 25'14

1

আপনার সমস্ত কমোম জেএস ফাইলগুলিকে একটি সাব-ফোল্ডারের মতো 'অ্যাপ্লিকেশন / সম্পদ / জাভাস্ক্রিপ্ট / গ্লোবাল' এ নিয়ে যান অ্যাপ্লিকেশন.জেজে, //= require_tree .লাইনটি এখানে পরিবর্তন করুন//= require_tree ./global

এখন আপনি আপনার অ্যাপ্লিকেশন / সম্পদ / জাভাস্ক্রিপ্ট / 'রুটে আপনার নিয়ামক-নির্দিষ্ট জেএস স্থাপনে মুক্ত এবং সেগুলি সংকলিত জেএসে অন্তর্ভুক্ত করা হবে না, যখন আপনি তাদের = javascript_include_tagআপনার নিয়ামক / দর্শনের মাধ্যমে কল করবেন ঠিক তখনই ব্যবহার করা হবে ।


কোনও উপায় নয়, এটি একটি পৃষ্ঠার জন্য লোড করার জন্য জাভাস্ক্রিপ্টের ক্র্যাপলোড। এমনকি এটি ক্যাশে থাকলেও কিছু যায় আসে না।
জ্যাকায়ালসাইন

1

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

%body{'data-page' => "#{controller}:#{action}" }

তারপরে dispatcher.js.coffeeআপনার জাভাস্ক্রিপ্ট ফোল্ডারে আপনার ফাইলে কেবল একটি ক্লোজার এবং একটি সুইচ স্টেটমেন্ট থাকবে :

$ ->
  new Dispatcher()

class Dispatcher
  constructor: ->
    page = $('body').attr('data-page')
    switch page
      when 'products:index'
        new Products() 
      when 'users:login'
        new Login()

স্বতন্ত্র ফাইলগুলিতে আপনাকে যা করতে হবে (বলুন products.js.coffeeবা login.js.coffeeউদাহরণস্বরূপ) এগুলি একটি শ্রেণিতে আবদ্ধ করা হয়েছে এবং তারপরে সেই শ্রেণীর প্রতীকটিকে বিশ্বায়ন করুন যাতে আপনি এটি প্রেরণকারীটিতে অ্যাক্সেস করতে পারেন:

class Products
  constructor: ->
    #do stuff
@Products = Products

গিটল্যাবের এর বেশ কয়েকটি উদাহরণ রয়েছে যা আপনি কৌতূহলী হওয়ার ক্ষেত্রে আপনাকে ঘিরে ধরতে চাইতে পারেন :)


1

Paloma প্রকল্প পৃষ্ঠা নির্দিষ্ট জাভাস্ক্রিপ্ট কোড পরিচালনা করার জন্য আকর্ষণীয় পদ্ধতির প্রস্তাব দেয়।

তাদের দস্তাবেজগুলির ব্যবহারের উদাহরণ:

var UsersController = Paloma.controller('Users');

// Executes when Rails User#new is executed.
UsersController.prototype.new = function(){
   alert('Hello Sexy User!' );
};

1

ধাপ 1. প্রয়োজনীয়_ট্রি সরান। আপনার অ্যাপ্লিকেশন.জেএস এবং অ্যাপ্লিকেশন.এসএস এ।

ধাপ ২. লেআউট ফোল্ডারে আপনার অ্যাপ্লিকেশন। Html.erb (রেল ডিফল্ট দ্বারা) সম্পাদনা করুন। নিম্নলিখিত ট্যাগগুলিতে "প্যারামগুলি [: নিয়ন্ত্রক]" যুক্ত করুন।

<%= stylesheet_link_tag    'application', params[:controller], media: 'all', 'data-turbolinks-track' => true %>

<%= javascript_include_tag 'application', params[:controller], 'data-turbolinks-track' => true %>

ধাপ 3. কনফিগারেশন / প্রারম্ভিক / সম্পদ.আরবিতে একটি ফাইল যুক্ত করুন

%w( controller_one controller_two controller_three ).each do |controller|
  Rails.application.config.assets.precompile += ["#{controller}.js", "#{controller}.js.coffee", "#{controller}.css", "#{controller}.scss"]
end

রেফারেন্স: http://theflyingdeveloper.com/controller-specific-assets-with-rails-4/


যতক্ষণ এই তাত্ত্বিক প্রশ্নের উত্তর হতে পারে, এটা বাঞ্ছনীয় হবে উত্তর অপরিহার্য অংশের এখানে অন্তর্ভুক্ত করা, এবং রেফারেন্স এর জন্য লিঙ্ক প্রদান।
ভার্গব রাও

0

আমি এটি চেষ্টা করে দেখিনি, তবে দেখে মনে হচ্ছে নিম্নলিখিতটি সত্য:

  • যদি আপনার কাছে জাভাস্ক্রিপ্টের কোনও সামগ্রী_ রয়েছে (যেমন এর মধ্যে প্রকৃত জাভাস্ক্রিপ্ট সহ) থাকে তবে স্প্রোককেটগুলি এটি সম্পর্কে জানত না এবং এটি এখনকার মতো একইভাবে কাজ করবে।

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


পৃষ্ঠাগুলিতে ফাইলগুলি বাদ দেওয়া বা কাস্টম জাভাস্ক্রিপ্ট ব্যবহার করা কি তখন "সঠিক উপায়ে"? লোকেরা কীভাবে এটি ব্যবহার করার ইচ্ছা করেছিল?
ফায়ার প্রতীক

@ ফায়ার এম্বেলেম ডেভিড কী উদ্দেশ্য নিয়েছে তার আমি খুব বেশি যত্ন করি না, কারণ আমি মনে করি না যে ডেভিড জাভাস্ক্রিপ্ট কীভাবে সঠিকভাবে व्यवस्थित করবেন তা বুঝতে পেরেছেন।
মার্নেন লাইবো-কোসার


0

আমি কিছু উত্তর একত্রিত করেছি:

অ্যাপ্লিকেশন সহায়ক:

module ApplicationHelper
  def js_page_specific_include
    page_specific_js = params[:controller] + '_' + params[:action]
    if Rails.application.assets.find_asset(page_specific_js).nil?
      javascript_include_tag 'application', 'data-turbolinks-track' => true
    else
      javascript_include_tag 'application', page_specific_js, 'data-turbolinks-track' => true
    end
  end
end

লেআউট / application.html.haml:

 <!DOCTYPE html>
%html{lang: 'uk'}
  %head   
    = stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true
   bla-bla-bla
    = js_page_specific_include   
   bla-bla-bla  

0

প্রথম: \\=require_treeঅ্যাপ্লিকেশন.জেএস থেকে অপসারণ দ্বিতীয়: আপনার সমস্ত জেএস কোড অবশ্যই আলাদা করতে হবে /app/assets/javascritptএবং আপনার সমস্ত সিএসএস কোড অবশ্যই এখানে আলাদা করতে হবে/app/assets/stylesheets


-2

রায়ান থেকে নেতৃত্ব অনুসরণ করে, আমি যা করেছি তা এখানে-

application.js.coffee

$ ->
    view_method_name = $("body").data("view") + "_onload"
    eval("#{view_method_name}()") if eval("typeof #{view_method_name} == 'function'")
    view_action_method_name = $("body").data("view") + "_"+$("body").data("action")+"_onload"
    eval("#{view_action_method_name}()") if eval("typeof #{view_action_method_name} == 'function'")

users.js.c کافی (নিয়ামক নির্দিষ্ট coffeescript, যেমন নিয়ন্ত্রণকারী: ব্যবহারকারী, ক্রিয়া: ড্যাশবোর্ড)

window.users_dashboard_onload = () ->
    alert("controller action called")
window.users_onload = () ->
    alert("controller called")

application.html.haml

%body{:data=>{:view=>controller.controller_name, :action=>controller.action_name}}

Downvoting। এটি হাস্যকরভাবে সংশ্লেষিত - evalযদি আপনার এইচটিএমএল ক্র্যাক সার্ভার বা দূষিত ইউজার স্ক্রিপ্ট দ্বারা আপস হয়ে যায় তবে নিরাপত্তাহীনতার (কারণ কারণে ) উল্লেখ না করা ।
মার্নেন লাইবো-কোসার 25'14

-3

এটি কীভাবে করবেন তা এখানে রয়েছে বিশেষত আপনার নির্দিষ্ট পৃষ্ঠার জন্য যদি আপনাকে প্রচুর লাইব্রেরি চালানো না হয় তবে কেবল কয়েক শ কয়েক লাইন জেএস কম-বেশি চালাতে হবে।

যেহেতু এটি জাভাস্ক্রিপ্ট কোডটি এইচটিএমএল এ এম্বেড করা পুরোপুরি ঠিক আছে তাই কেবল অ্যাপ / ভিউ শেয়ারড.জেএস ডিরেক্টরিতে তৈরি করুন এবং সেখানে আপনার পৃষ্ঠা / পৃষ্ঠাগুলি নির্দিষ্ট কোডটি my_cool_partial.html.erb এর ভিতরে রাখুন

<script type="text/javascript"> 
<!--
  var your_code_goes_here = 0;
  function etc() {
     ...
  }
-->
</script>

সুতরাং এখনই আপনি যেখান থেকে চাইবেন কেবল তা করুন:

  = render :partial => 'shared.js/my_cool_partial'

এবং এটা, কে?


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