রেলগুলি ব্লকের সাথে আংশিক রেন্ডার করে


119

আমি এইচটিএমএল উপাদানটি পুনরায় ব্যবহার করার চেষ্টা করছি যা আমি লিখেছি যা প্যানেল স্টাইলিং সরবরাহ করে। কিছুটা এইরকম:

  <div class="v-panel">
    <div class="v-panel-tr"></div>
    <h3>Some Title</h3>
    <div class="v-panel-c">
      .. content goes here
    </div>
    <div class="v-panel-b"><div class="v-panel-br"></div><div class="v-panel-bl"></div></div>
  </div>

সুতরাং আমি দেখতে পাচ্ছি যে রেন্ডারটি একটি ব্লক নেয়। আমি অনুভব করেছি তখন আমি এরকম কিছু করতে পারি:

# /shared/_panel.html.erb
<div class="v-panel">
  <div class="v-panel-tr"></div>
  <h3><%= title %></h3>
  <div class="v-panel-c">
    <%= yield %>
  </div>
  <div class="v-panel-b"><div class="v-panel-br"></div><div class="v-panel-bl"></div></div>
</div>

এবং আমি এর মতো কিছু করতে চাই:

#some html view
<%= render :partial => '/shared/panel', :locals =>{:title => "Some Title"} do %>
  <p>Here is some content to be rendered inside the panel</p>
<% end %>

দুর্ভাগ্যক্রমে এটি এই ত্রুটির সাথে কাজ করে না:

ActionView::TemplateError (/Users/bradrobertson/Repos/VeloUltralite/source/trunk/app/views/sessions/new.html.erb:1: , unexpected tRPAREN

old_output_buffer = output_buffer;;@output_buffer = '';  __in_erb_template=true ; @output_buffer.concat(( render :partial => '/shared/panel', :locals => {:title => "Welcome"} do ).to_s)
on line #1 of app/views/sessions/new.html.erb:
1: <%= render :partial => '/shared/panel', :locals => {:title => "Welcome"} do -%>
...

সুতরাং এটি কোনও =ব্লকের সাথে স্পষ্টতই পছন্দ করে না , তবে আমি যদি এটি সরিয়ে ফেলি তবে এটি কিছুই আউটপুট দেয় না।

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


1
গৃহীত উত্তরটি সঠিক, তবে যেহেতু 5.0.0 layoutরেলগুলি এটি- কার্যকরী ছাড়াই সম্ভব , তাই গাইডগুলি দেখুন। rubyonrails.org/…
ফেবি

উত্তর:


208

উপরের উত্তরগুলি উভয়ই কাজ করার সময় (উদাহরণস্বরূপ যে টনিটির যে কোনও উপায়ে লিঙ্ক করেছেন) আমি উপরের পোস্টটিতে সর্বাধিক সংক্ষিপ্ত উত্তর খুঁজে পেয়েছি (কর্নেলিস সিয়েটসমা মন্তব্য করেছেন)

আমি অনুমান render :layoutকরে ঠিক আমি যা খুঁজছেন ছিল:

# Some View
<%= render :layout => '/shared/panel', :locals => {:title => 'some title'} do %>
  <p>Here is some content</p>
<% end %>

সংযুক্ত:

# /shared/_panel.html.erb
<div class="v-panel">
  <div class="v-panel-tr"></div>
  <h3><%= title -%></h3>
  <div class="v-panel-c">
    <%= yield %>
  </div>
</div>

6
<%= %><% %><%= render :layout => '/shared/panel',
ails.২.২ কারাগারে

আপনি ঠিক বলেছেন, এই পোস্টটি রেল সংস্করণ সম্পর্কে কোনও অনুমান করে না, আমি নিশ্চিত যে লোকেরা এটি নির্ধারণ করতে পারে।
ব্র্যাড

এটির মতো (আমার সমস্যার সমাধান করে তাই +1) তবে এটি কি ভাল অভ্যাস? কোন কারণে কিছুটা মন্দা লাগবে না? ডাটাবেস অন্য ফলনের কারণ হিসাবে মনে করার চেয়ে শীঘ্রই ট্রিগার হয়ে উঠেছে (এখন নিজেই তদন্ত করার সময় নেই, কেবল ভাবছি)
সমমান

1
কোনও বিষয়বস্তু পাওয়া গেছে কিনা তা জানার কোনও উপায়? এটি ক্ষেত্রে .চ্ছিক।
ভাদোরকোয়েস্ট

3
রেল 5.0 এ একটি পরিবর্তন হয়েছিল তাই এটি কেবলমাত্র বিন্যাস নয়, সমস্ত পার্টির কাছে সাধারণ। আপনি কলিং কোডের প্রথম লাইনটি এতে পরিবর্তন করতে পারেন:<%= render '/shared/panel', title: 'some title' do %>
জে মিচেল

27

পূর্ববর্তী উত্তরের উপর ভিত্তি করে এখানে একটি বিকল্প রয়েছে।

এতে আপনার আংশিক তৈরি করুন shared/_modal.html.erb:

<div class="ui modal form">
  <i class="close icon"></i>
  <div class="header">
    <%= heading %>
  </div>
  <div class="content">
    <%= capture(&block) %>
  </div>
  <div class="actions">
    <div class="ui negative button">Cancel</div>
    <div class="ui positive button">Ok</div>
  </div>
</div>

আপনার পদ্ধতিটি এখানে নির্ধারণ করুন application_helper.rb:

def modal_for(heading, &block)
  render(
    partial: 'shared/modal',
    locals: { heading: heading, block: block }
  )
end

যেকোন দর্শন থেকে এটি কল করুন:

<%= modal_for('My Title') do |t| %>
  <p>Here is some content to be rendered inside the partial</p>
<% end %>

11

আপনি ক্যাপচার সহায়ক এবং এমনকি রেন্ডার কলটিতে ইনলাইন ব্যবহার করতে পারেন:

<%= render 'my_partial',
           :locals => { :title => "Some Title" },
           :captured => capture { %>
    <p>Here is some content to be rendered inside the partial</p>
<% } %>

এবং ভাগ করা / প্যানেলে:

<h3><%= title %></h3>
<div class="my-outer-wrapper">
  <%= captured %>
</div>

যা উত্পাদন করবে:

<h3>Some Title</h3>
<div class="my-outer-wrapper">
  <p>Here is some content to be rendered inside the partial</p>
</div>

Http://api.rubyonrails.org/class/ActionView/Helpers/CaptureHelper.html দেখুন


1
আংশিক প্রয়োজন একাধিক ব্লকের জন্য ইনলাইন প্যাটার্নটি দুর্দান্ত।
মাহমোফ

4

গৃহীত উত্তরের উপর ভিত্তি করেই এটিই আমার জন্য রেল 4 ব্যবহার করে ভাল কাজ করেছে।

আমরা এই জাতীয় প্যানেল রেন্ডার করতে পারি:

= render_panel('Non Compliance Reports', type: 'primary') do
  %p your content goes here!

এখানে চিত্র বর্ণনা লিখুন

এটির জন্য একটি সহায়তা পদ্ধতি এবং একটি ভাগ করা ভিউ প্রয়োজন:

সহায়ক পদ্ধতি (ui_helper.rb)

def render_panel(heading, options = {}, &block)
  options.reverse_merge!(type: 'default')
  options[:panel_classes] = ["panel-#{options[:type]}"]

  render layout: '/ui/panel', locals: { heading: heading, options: options } do
    capture(&block)
  end
end

দেখুন (/ui/panel.html.haml)

.panel{ class: options[:panel_classes] }
  .panel-heading= heading
  .panel-body
    = yield

এটিও রেল x.x এ কাজ করে, আমার কেবলমাত্র পরিবর্তিত panel.html.hamlহওয়া দরকার_panel.html.haml
ক্রিস

1

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

<% foo = render :partial => '/shared/panel', :locals =>{:title => "Some Title"} do %>
<p>Here is some content to be rendered inside the panel</p>
<% end %>
<%= foo %>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.