আমি কীভাবে রেলগুলিতে আলাদা বিন্যাসের আংশিক রেন্ডার করব?


114

আমি একটি JSON প্রতিক্রিয়া উত্পন্ন করার চেষ্টা করছি যাতে কিছু HTML অন্তর্ভুক্ত থাকে। সুতরাং, আমি আছে /app/views/foo/bar.json.erb:

{
  someKey: 'some value',
  someHTML: "<%= h render(:partial => '/foo/baz') -%>"
}

আমি এটি রেন্ডার করতে চাই /app/views/foo/_baz.html.erbতবে এটি কেবল রেন্ডার হবে /app/views/foo/_baz.json.erb। পাস করা :format => 'html'কোনও উপকারে আসে না।


জেমসের বিশেষ সমস্যার চেয়ে প্রশ্নের শিরোনামটি অনেক বেশি সাধারণ। : যদি আপনি খুঁজছেন অন্যান্য সমাধানের জন্য, একটি চেহারা এখানে নেওয়া stackoverflow.com/questions/7616097/...
miguelsan

উত্তর:


100

রেল ৩.২.৩ দিয়ে শুরু করা, যখন রেন্ডার কল করার সময়: আংশিক (কেবলমাত্র respond_toব্লকের বাইরে কাজ করে )।

render formats: [ :html ]

পরিবর্তে

render format: 'html'

আমি সেখানে ভিন্ন "শ্রেষ্ঠ" প্রসঙ্গ উপর নির্ভর করে উত্তর হতে পারে, তাই এই প্রশ্নে অর্থপূর্ণ ভোট দিন করা কঠিন, কিন্তু এই প্রত্যাশী পর সহজে একই নামের একটি আরজে-দের একটির মধ্য থেকে একটি HTML টেম্পলেট রেন্ডারিং আমার প্রয়োজন পূর্ণ করে একটি :formatবিকল্প would হবে। ধন্যবাদ!
শেইজ

1
এটিও 5.0.2 রেলের জন্য কাজ করে। তবে নোট করুন যে :content_typeকোনও ক্ষেত্রে আপনাকে অপশনটি নির্দিষ্ট করতেও হতে পারে - যেমন কোনও format.pdfব্লকের অভ্যন্তর থেকে এইচটিএমএল টেমপ্লেট রেন্ডারিংয়ের মাধ্যমেই কাজটি করা যেতে পারে render "template", formats: [:html], content_type: "text/html"। আমার এটি দরকার কারণ আমি কেবলমাত্র আমার ইমেল তালিকার সদস্যদের জন্য আমার বইয়ের নমুনাগুলির সরাসরি ডাউনলোডের অনুমতি দিই - নিয়মিত দর্শনার্থীরা পরিবর্তে একটি সাইনআপ ফর্ম পান।
মাইকেল ট্রোজানেক

64

কি সমস্যা

render :partial => '/foo/baz.html.erb'

? আমি এটম বিল্ডার টেম্পলেটটির ভিতরে থেকে এইচটিএমএল ইআরবি আংশিক রেন্ডার করার চেষ্টা করেছি এবং এটি দুর্দান্ত কাজ করেছে। গ্লোবাল ভেরিয়েবলগুলি নিয়ে কোনও গোলমাল করার প্রয়োজন নেই (হ্যাঁ, আমি জানি তাদের সামনে তাদের "@" রয়েছে, তবে তারা সেগুলি কী)।

যদিও আপনার with_format &blockপদ্ধতিটি দুর্দান্ত and


26
এর একমাত্র ক্ষতিটি হ'ল যদি আপনার আংশিক অন্যান্য পার্টিয়ালগুলি রেন্ডার করে তবে এটি ব্যর্থ হবে যদি না আপনি প্রবেশ করেন এবং আপনার সমস্ত রেন্ডার আংশিক কলগুলি তাদের নামে ".html.erb" অন্তর্ভুক্ত না করে পরিবর্তন করেন।
ক্রিসারবাইলি

4
এটি কাজ করার জন্য আপনাকে টেম্প্লেটিং ইঞ্জিন নির্দিষ্ট করতে হবে না। (কমপক্ষে রেল হিসাবে 3) নিম্নলিখিতটি ঠিক কাজ করে: রেন্ডার (: আংশিক => "baz.html")
টিম হার্পার

1
আপনার বিভিন্ন লোকেলের (যেমন baz.en.html.erb, baz.fr.html.erb) আলাদা আলাদা পার্টিয়াল থাকলে কাজ করে না এবং ডানটি render :partialবেছে নেওয়ার জন্য আপনার যুক্তি চাই (ফলব্যাকস ইত্যাদি)।
জন

1
রেল ৩.২.৩ হিসাবে, এই সমাধানটি ব্যবহার করার সময় আমি নিম্নলিখিত সতর্কতাটি দেখছি:DEPRECATION WARNING: Passing a template handler in the template name is deprecated. You can simply remove the handler name or pass render :handlers => [:erb] instead.
ওয়াইডাব্লুসিএ হ্যালো

3
এই পদ্ধতির একটি খারাপ দিক হ'ল স্থানীয়করণগুলি foo.baz.html.[your_string]পরিবর্তে সন্ধান করবে foo.baz.[your_string]। zgchurc এর উত্তর একটি ভাল সমাধান।
এমবিলার্ড

32

রেল 3 এর জন্য, উইথ_ফর্ম্যাট ব্লকটি কাজ করে তবে এটি কিছুটা আলাদা:

  def with_format(format, &block)
    old_formats = formats
    self.formats = [format]
    block.call
    self.formats = old_formats
    nil
  end

রেলওয়ের সাথে কাজ করে 3.2.0 খুব :)
গকি

32

রেল 4 আপনাকে একটি ফর্ম্যাট প্যারামিটার পাস করার অনুমতি দেবে। সুতরাং আপনি করতে পারেন

render(:partial => 'form', :formats => [:html])} 

দ্রষ্টব্য আপনি রেল 3 এ অনুরূপ কিছু করতে পারেন তবে এটি কোনও ফর্ম্যাটাল (যদি ফর্ম অন্যান্য পার্টিয়ালকে কল করে) সেই ফর্ম্যাটটি দেয় না।

আপনার কনফিগার / ইনিশিয়ালাইজার / রেন্ডারআরবি তৈরি করে রেল 3 এ 4 টি ক্ষমতা থাকতে পারে:

class ActionView::PartialRenderer
  private
  def setup_with_formats(context, options, block)
    formats = Array(options[:formats])
    @lookup_context.formats = formats | @lookup_context.formats
    setup_without_formats(context, options, block)
  end

  alias_method_chain :setup, :formats
end

Http://railsguides.net/2012/08/29/rails3-does-not-render-partial-for-specific- formatt/ দেখুন


অদ্ভুত, আমি কেন জানি না কেন এটি আমার জন্য একটি রেল ৩.২.১৯ অ্যাপ্লিকেশনটিতে কাজ করছে না, আমার অ্যাপ্লিকেশনটির মধ্যে কী পার্থক্য রয়েছে তা অবাক করে দিয়েছি। অ্যাকশনভিউ রেন্ডার পাওয়া যায় না: আংশিক: শ্রদ্ধার সাথে সম্মতি জানাতে, এই প্যাচটি দিয়েও কোনও পার্থক্য নেই বলে মনে হয়।
জ্রোকাইন্ড

29

উপর নির্মাণের roninek প্রতিক্রিয়া , আমি সবচেয়ে ভালো সমাধান পেয়েছি নিম্নলিখিত হতে:

ইন / অ্যাপ / শেল্পারস / অ্যাপ্লিকেশন.আরবি:

def with_format(format, &block)
  old_format = @template_format
  @template_format = format
  result = block.call
  @template_format = old_format
  return result
end

ইন / অ্যাপ / ভিউস / ফু / বার.জেসন:

<% with_format('html') do %>
  <%= h render(:partial => '/foo/baz') %>
<% end %>

একটি বিকল্প সমাধান প্যারামিটার renderগ্রহণ করার জন্য নতুন সংজ্ঞা দেওয়া হবে :format

আমি render :fileস্থানীয়দের সাথে কাজ করতে পারি না এবং কোনও পথ বিন্দুমাত্র ছাড়াই না।


8
আমার স্বাদ জন্য খুব হ্যাকিশ। পুরো এক্সটেনশনটি নির্দিষ্ট করা ভাল।
টিম হার্পার

1
রেল 3 এর জন্য zgchurch এর উত্তর দেখুন।
লিলিক

25

রেলস 3 এ, ভিউতে একটি ফর্ম্যাট অ্যারে রয়েছে যার অর্থ আপনি এটি [: মোবাইল,: এইচটিএমএল] সন্ধানের জন্য সেট করতে পারেন। সেটিংস অনুসন্ধানে ডিফল্ট হবে: মোবাইল টেম্পলেটগুলি, তবে পিছনে পড়ে: এইচটিএমএল টেমপ্লেটগুলি। এটি সেট করার প্রভাবগুলি অভ্যন্তরীণ পার্টিতে ঝাঁকুনি ফেলবে।

সবচেয়ে ভাল, তবে ত্রুটিযুক্ত উপায়টি, যা আমি এটি নির্ধারণ করতে পারি তা হ'ল প্রতিটি লাইন টেমপ্লেটের শীর্ষে এই লাইনটি রাখা (তবে পার্টিয়াল নয়)।

<% self.formats = [:mobile, :html] %>

ত্রুটিটি হ'ল আপনাকে সেই লাইনটি একাধিক টেম্পলেটগুলিতে যুক্ত করতে হবে। কেউ যদি এটিকে একবার সেট করার কোনও উপায় জানেন, প্রয়োগ_কন্ট্রোলআরবি থেকে, আমি এটি জানতে আগ্রহী। দুর্ভাগ্যক্রমে, এটি আপনার মোবাইল লেআউটে সেই লাইনটি যুক্ত করতে কাজ করে না, কারণ টেমপ্লেটগুলি বিন্যাসের আগে রেন্ডার করা হয়।


এটি ব্যাখ্যা করার জন্য আপনাকে ধন্যবাদ। আমি এটি অন্য কোথাও ব্যবহার করে শেষ করেছি: স্ট্যাকওভারফ্লো
জোশুয়া পিন্টার

16

জেডজিচার্চ কী লিখেছেন তা সবিস্তারে ব্যাখ্যা করে:

  • অ্যাকাউন্টে ব্যতিক্রম গ্রহণ
  • বলা ব্লকের ফলাফল ফিরিয়ে

ভেবেছি এটি কার্যকর হতে পারে।

def with_format(format, &block)
  old_formats = formats
  begin
    self.formats = [format]
    return block.call
  ensure
    self.formats = old_formats
  end
end

10

আপনার দুটি বিকল্প রয়েছে:

1) ব্যবহার render :file

render :file => "foo/_baz.json.erb"

2) টেমপ্লেট ফর্ম্যাটটি @template_format ভেরিয়েবল সেট করে এইচটিএমএল রূপান্তর করুন

<% @template_format = "html" %>
<%= h render(:partial => '/foo/baz') %>

1
<% @template_format = "html"%> আমার পক্ষে কাজ করেছে, আমার আংশিক লোড হওয়া অন্যান্য পার্টিয়ালগুলি আমাকে শৃঙ্খলে রেখে অন্যান্য রেন্ডারগুলি আপডেট করতে হয়নি।
পেজট্রাইব

5

আমার কাছে 'এপিআই / আইটেম.আরবিএল' নামে একটি ফাইল ছিল এবং আমি এটি একটি HTML ভিউ থেকে রেন্ডার করতে চেয়েছিলাম যাতে আমাকে ব্যবহার করতে হয়েছিল:

render file: 'api/item', formats: [:json]

( fileকারণ ফাইলটির নামে কোনও আন্ডারস্কোর নেই, formatsএবং নয় format(এবং পাস এবং অ্যারে))


2

দেখে মনে হচ্ছে যে কোনও formatsবিকল্পটি পাস করা এটি কমপক্ষে 3.2 টি নতুন রেল সংস্করণে যথাযথভাবে রেন্ডার করবে:

{
  someKey: 'some value',
  someHTML: "<%= h render('baz', formats: :html) -%>"
}

1

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

xml.items :type => "array" do
    @items.each do |item|
        xml << render(:partial => 'shared/partial.xml.builder', :locals => { :item => item })
    end
end

এবং হ্যাঁ ... পুরো ফাইলের নাম এখানেও কাজ করে ...


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