আংশিক উপস্থিতি আছে কিনা তা পরীক্ষা করার জন্য কি কোনও রেল ফাংশন রয়েছে?


98

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

    <% begin %>
      <%= render :partial => "#{dynamic_partial}" %>
    <% rescue ActionView::MissingTemplate %>
      Can't show this data!
    <% end %>

4
উত্তর যেটি ব্যবহার করে rescueতা ঝুঁকিপূর্ণ। আমি এটি ব্যবহার করার আগে অন্যান্য সমাধানগুলি তাকান।
গ্রান্ট হাচিনস

উত্তর:


99

বর্তমানে, আমি আমার রেল 3 / 3.1 প্রকল্পগুলিতে নিম্নলিখিতগুলি ব্যবহার করছি:

lookup_context.find_all('posts/_form').any?

অন্যান্য সমাধানগুলির ক্ষেত্রে আমি যে সুবিধাটি দেখেছি তা হ'ল এটি কেবল আপনার রেলের মূলের পরিবর্তে সমস্ত দৃষ্টিতে দেখবে। এটি আমার কাছে গুরুত্বপূর্ণ কারণ আমার প্রচুর রেল ইঞ্জিন রয়েছে।

এটি রেলস 4 এও কাজ করে।


9
look_context.exists? ('পোস্ট / সন্ধান') আমার পক্ষে কাজ করে না। পরিবর্তে আমি এই উদাহরণটিতে লুকিং_কন্টেক্সটেক্সটেক্সিস্টস? (নাম, উপসর্গ, আংশিক) বা লকআপ_কন্টেন্ট.এক্সেস্ট? ('সন্ধান', 'পোস্ট', সত্য) ব্যবহার করেছি?
জেন

4
এটি বর্তমান (রেল> = 3.2) টেমপ্লেটগুলি (উত্স এপিডক ) চেক করার উপায়
maček

4
যদি আংশিক বর্তমান ভিউ টেমপ্লেটের একই ফোল্ডারে থাকে তবে আপনি ব্যবহার করতে পারেন lookup_context.exists?("find", lookup_context.prefixes, true)। এইভাবে, কলটিতে আপনাকে ভিউ ডিরেক্টরিটি হার্ড-কোড করার দরকার নেই। দ্রষ্টব্য, এটি পার্টিয়ালগুলির জন্য। পার্টিশন না করার জন্য, শেষ আর্গটি বাদ দিন (বা সত্যের পরিবর্তে মিথ্যা ব্যবহার করুন)
নাথান ওয়ালেস

72

আমিও এর সাথে লড়াই করে যাচ্ছিলাম। এই পদ্ধতিটি আমি ব্যবহার করে শেষ করেছি:

<%= render :partial => "#{dynamic_partial}" rescue nil %>

মূলত, যদি আংশিক উপস্থিতি না থাকে তবে কিছুই করবেন না। আংশিক অনুপস্থিত থাকলে, আপনি কি কিছু মুদ্রণ করতে চান?

সম্পাদনা 1: ওহ, আমি বোধগম্যতা পড়তে ব্যর্থ হই। আপনি বলেছিলেন যে আপনি অন্য কিছু সরবরাহ করতে চেয়েছিলেন। সেক্ষেত্রে, এ কেমন?

<%= render :partial => "#{dynamic_partial}" rescue render :partial => 'partial_that_actually_exists' %>

বা

<%= render :partial => "#{dynamic_partial}" rescue "Can't show this data!" %>

সম্পাদনা 2:

বিকল্প: আংশিক ফাইলের অস্তিত্বের জন্য পরীক্ষা করা:

<%= render :partial => "#{dynamic_partial}" if File.exists?(Rails.root.join("app", "views", params[:controller], "_#{dynamic_partial}.html.erb")) %>

6
আমার প্রশ্ন হচ্ছে যে, আমি ব্যতিক্রমসমূহ ব্যবহার করতে প্রবাহ নিয়ন্ত্রণ, যা একটি অ্যান্টি-প্যাটার্ন কি চাই না: stackoverflow.com/questions/1546514/...
ড্যানিয়েল Cukier

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

4
আমি সমাধানটি পছন্দ করি, তবুও এটি আংশিকভাবে ফেলে দেওয়া কোনও ধরণের ব্যতিক্রম গিলে ফেলে। আইএমএইচএও এটির ত্রুটিগুলি ট্র্যাক করা শক্ত করে তোলে।
ম্যাট

5
আপনার যদি ভিন্ন ধরণের ব্যতিক্রম থাকে তবে পদ্ধতি rescue nilএবং ... rescue ...পদ্ধতিগুলি এটি আড়াল করবে। এটি ডিবাগ করা শক্ত যে বাগগুলিতে নিয়ে যায়।
নিকোলয়েডস

8
আমি এই সমাধানটি সত্যিই অপছন্দ করি। উদ্ধার ব্যয়বহুল, এবং ফাইল.এক্সেস্টিজ? অনুমান করে যে আংশিকটি কেবলমাত্র এক জায়গায় থাকতে পারে। আমি বিশ্বাস করি যেভাবে পুনরায় লুকিং কনটেক্সট ব্যবহার করে @ রিনের সমাধান।
বার্ট গোথালস

53

একটি ভিউ এর ভিতরে থেকে, টেমপ্লেট_অস্তিত্ব? কাজ করে, তবে কলিং কনভেনশনটি একক আংশিক নামের স্ট্রিংয়ের সাথে কাজ করে না, পরিবর্তে এটি টেম্পলেট_এক্সিস্ট লাগে? (নাম, উপসর্গ, আংশিক)

পথে আংশিক অনুসন্ধান করতে: অ্যাপ্লিকেশন / দর্শন / পোস্টগুলি / _for.html.slim

ব্যবহার:

lookup_context.template_exists?("form", "posts", true)

Ails.০.১০ রেলগুলিতে আমি দেখতে পেয়েছি যে যদি আমার কোনও বিকল্প এক্সটেনশন থাকে যেমন অ্যাপ / ভিউ / পোস্ট / _foo.txt.erb এর মতো, আমার যুক্তিটি যুক্ত করতে হবে: টেম্পলেট_এক্সিস্টস? ("Foo.txt", "পোস্ট" , সত্য)
গ্যাব মার্টিন-ডেম্পেসি


এটি রিয়েল ৩.২.x এ অর্পিত বলে মনে হয় না, তবে দ্বিতীয় যুক্তি উপসর্গের একটি অ্যারে ray তদতিরিক্ত, এটি বর্তমান নিয়ামকের উপর বিদ্যমান।
ব্রেন্ডন

4
Lookup_context.template_exists ( "ফর্ম", lookup_context.prefixes, সত্য): আপনি দ্বিতীয় আর্গুমেন্ট হিসাবে lookup_context.prefixes ব্যবহার করতে পারি?
lion.vollnhals

ভিউ স্তর থেকে এই তথ্য অ্যাক্সেস করার ক্ষেত্রে এটি আরও ভাল উত্তর।
ব্রেন্ডন মুইর

30

Ails.২.১৩ রেলগুলিতে, আপনি যদি কোনও নিয়ামক হন তবে আপনি এটি ব্যবহার করতে পারেন:

template_exists?("#{dynamic_partial}", _prefixes, true)

template_exists?lookupcontextআপনি যেমন দেখতে পাচ্ছেন তেমন একটি প্রতিনিধি দেওয়া হয়েছেAbstractController::ViewPaths

_prefixes নিয়ামকের উত্তরাধিকার শৃঙ্খলার প্রসঙ্গ দেয়।

true কারণ আপনি একটি আংশিক খুঁজছেন (আপনি যদি নিয়মিত টেম্পলেট চান তবে আপনি এই যুক্তিটি বাদ দিতে পারেন)।

http://api.rubyonrails.org/class/ActionView/LookupContext/ViewPaths.html#method-i-template_exists-3F


উত্সাহিত। আরও আধুনিক ও পরামিতিগুলির আরও ভাল ব্যাখ্যা।
জ্যাকোসিমিওন

4
(যেমন একটি লেআউট হিসাবে) একটি দৃশ্য থেকে, এই কাজগুলো করেনঃ lookup_context.template_exists?("navbar", controller._prefixes, :partial)। এই লেআউটটিকে রেন্ডারিংয়ের বর্তমান টেম্পলেটটিতে বর্ণিত "নভবার" আংশিক রয়েছে এবং এটি যদি আমি রেন্ডার করতে পারি তবে এটি আমাকে বলে। আমি :partialযে বুলিয়ান কি তা স্পষ্ট করে বলতে :partialপেরেছি - সত্যবাদী। _prefixesবিটের জন্য ধন্যবাদ , @ ফ্ল্যাকউ!
পিডবব

আপনি যদি অন্য কোনও প্যারেন্ট ডিরেক্টরিতে আংশিক কল _prefixesকরেন nilতবে এর সাথে প্রতিস্থাপন করুন ।
বেন

8

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

রেলস 4.2

প্রথমত, আমি এটি আমার অ্যাপ্লিকেশন_হেল্পার.আরবিতে রেখেছি

  def render_if_exists(path_to_partial)
    render path_to_partial if lookup_context.find_all(path_to_partial,[],true).any?
  end

এবং এখন কল করার পরিবর্তে

<%= render "#{dynamic_path}" if lookup_context.find_all("#{dynamic_path}",[],true).any? %>

আমি শুধু কল <%= render_if_exists "#{dynamic_path}" %>

আশা করি এইটি কাজ করবে. (রেল 3 এ চেষ্টা করা হয়নি)


4
আপনি যদি ফ্যালব্যাক সরবরাহ করতে চান তবে এটি কাজ করে না। এটি স্থানীয় ভেরিয়েবলগুলিও বিবেচনায় নেয় না।
ফিলিস্ক্লিক

আমি ঠিক এটিই খুঁজছিলাম। খুব পরিষ্কার উত্তর।
সানি

4
@BenPolinsky আমি আপনি ব্যবহার করতে পারেন অনুমান করা def render_if_exists(*args); render(*args) if ...যে
সাইটগুলিতে

6

আমি এই দৃষ্টান্তটি অনেক উপলক্ষে দুর্দান্ত সাফল্যের সাথে ব্যবহার করেছি:

<%=
  begin
    render partial: "#{dynamic_partial}"
  rescue ActionView::MissingTemplate
    # handle the specific case of the partial being missing
  rescue
    # handle any other exception raised while rendering the partial
  end
%>

উপরের কোডটির সুবিধাটি হ'ল আমরা নির্দিষ্ট কেসগুলি পরিচালনা করতে পারি:

  • আংশিকটি আসলে অনুপস্থিত
  • আংশিকটি বিদ্যমান, তবে এটি কোনও কারণে ত্রুটি ছুঁড়েছে

যদি আমরা কেবল কোড <%= render :partial => "#{dynamic_partial}" rescue nil %>বা কিছু উদ্দীপক ব্যবহার করি তবে আংশিক উপস্থিতি থাকতে পারে তবে একটি ব্যতিক্রম বাড়াতে পারে যা নিঃশব্দে খাওয়া হবে এবং ডিবাগ করার জন্য ব্যথার উত্স হয়ে উঠবে।


4

আপনার নিজের সহায়ক সম্পর্কে কি:

def render_if_exists(path, *args)
  render path, *args
rescue ActionView::MissingTemplate
  nil
end
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.