প্রতি পদক্ষেপে কারাগারের লেআউট?


165

আমি কিছু ক্রিয়াকলাপের জন্য আলাদা লেআউট ব্যবহার করি (বেশিরভাগ নিয়ামকগুলিতে নতুন কর্মের জন্য)।

আমি ভাবছি লেআউটটি নির্দিষ্ট করার সর্বোত্তম উপায়টি কী হবে? (আমি একই নিয়ামকটিতে 3 বা আরও বেশি লেআউট ব্যবহার করছি)

আমি ব্যবহার পছন্দ করি না

রেন্ডার: বিন্যাস => 'নাম'

আমি করতে পছন্দ

লেআউট 'নাম',: কেবল => [: নতুন]

তবে আমি 2 বা আরও বেশি লেআউট নির্দিষ্ট করতে এটি ব্যবহার করতে পারি না।

উদাহরণ স্বরূপ:

যখন আমি একই নিয়ামকটিতে 2 বার লেআউটকে কল করি তখন বিভিন্ন লেআউটের নাম এবং ভিন্ন ভিন্ন বিকল্পের সাথে প্রথমটি উপেক্ষা করা হয় - actions ক্রিয়াগুলি আমার নির্দিষ্ট করা বিন্যাসে প্রদর্শিত হয় না।

দ্রষ্টব্য: আমি রেল 2 ব্যবহার করছি।



1
ভাল যুক্তি. রেল 2 এর জন্য ডকুমেন্টেশন: গাইড.আরবিওনরইলস.অর্গ
কেভিন

2
(এছাড়াও, আমি ভবিষ্যতের পাঠকদের সহায়তার জন্য গাইডটি পোস্ট করেছি I আমার কোনও সন্দেহ নেই যে আপনার সমস্যাটি দীর্ঘদিন আগে সমাধান হয়েছে had-)
কেভিন

উত্তর:


297

লেআউট সেট করতে আপনি একটি পদ্ধতি ব্যবহার করতে পারেন।

class MyController < ApplicationController
  layout :resolve_layout

  # ...

  private

  def resolve_layout
    case action_name
    when "new", "create"
      "some_layout"
    when "index"
      "other_layout"
    else
      "application"
    end
  end
end

22
শীতল ধন্যবাদ. এবং যদি কেউ ওয়ানলাইনারের সাহায্যে সহজ কাজ করতে চান তবে নিম্নলিখিতগুলি সম্ভব। এটি পড়তে সহজ এবং নিয়ামকের শীর্ষে রাখে। ---layout Proc.new{ ['index', 'new', 'create'].include?(action_name) ? 'some_layout' : 'other_layout' }
হলি

1
যদি বিভিন্ন লেআউট যথাক্রমে বিভিন্ন সিএসএস এবং জেএসএস ফাইলগুলি ব্যবহার করে তবে অ্যাপ্লিকেশন কর্মক্ষমতাতে এটির কি বড় প্রভাব ফেলবে?
Noz

15
-1: খুব জটিল। নীচের মন্তব্য ( স্ট্যাকওভারফ্লো.com / a / 21203783 / 285154 ) সেরা বিকল্প।
dimitarvp

ধন্যবাদ! এটি এখনও 4.2 রেলের মধ্যে একটি সমস্যা, সম্ভবত আপনি যদি বহু স্তরে উত্তরাধিকারী নিয়ন্ত্রকদের ব্যবহার করছেন। আমি আগে পদ্ধতি ব্যবহার করেছি, তবে পরীক্ষার কথা ভাবছিলাম না যে যখন এখন আমার সমস্যা হয়েছিল তখন আবার ধন্যবাদ।
244 ই

@ ডিমিটকো না এটি নয়, আমি ইতিমধ্যে প্রশ্নটির মধ্যেই সমাধানটি উল্লেখ করেছি। আপনি 3 বা আরও বিভিন্ন লেআউট (ঠিক আমার ক্ষেত্রে যেমন) ব্যবহার করতে চান তা কাজ করে না।
mrbrdo

201

আপনি যদি কেবল দুটি বিন্যাসের মধ্যে নির্বাচন করছেন তবে আপনি ব্যবহার করতে পারেন :only:

class ProductsController < ApplicationController
   layout "admin", only: [:new, :edit]
end

অথবা

class ProductsController < ApplicationController
   layout "application", only: [:index]
end

2
ঠিক আছে, এর সাথে সমস্যাটি হ'ল শর্তসাপেক্ষে লেআউটটি নির্ধারণ করতে আপনি কারেন্ট_উজারের মতো অবজেক্টগুলিতে অ্যাক্সেস করতে পারবেন না
অ্যান্ড্রু কে

@ অ্যান্ড্রুকে গতিশীলভাবে একটি বিন্যাস নির্বাচন করা জিজ্ঞাসা করা প্রশ্নের অংশ বলে মনে হচ্ছে না।
নিক

11
যদি আপনারা কেউ যদি প্রশ্নটি পড়ে থাকেন তবে আপনি জানতে পারবেন যে এটি সঠিক উত্তর নয়, কারণ আমি ইতিমধ্যে প্রশ্নটিতে এই সমাধানটি বর্ণনা করেছি এবং এটি আমার ক্ষেত্রে কেন কাজ করে না (3 বা ততোধিক বিন্যাস)।
mrbrdo

2
যেমন এমআরবর্ডো বলেছিলেন, এটি উত্তর নয়। তাঁর প্রশ্নটি বিশেষভাবে ইঙ্গিত করে (I am using 3 or more different layouts in the same controller)। এই উত্তরটি একটি বিন্যাস এবং কোনও বিন্যাসকে অনুমতি দেয়, ভিন্ন বিন্যাসকে নয়
মাইকেল

49

জবাব_টি ব্যবহার করে আপনি পৃথক ক্রিয়াকলাপের জন্য বিন্যাসটি নির্দিষ্ট করতে পারেন :

  def foo
    @model = Bar.first
    respond_to do |format|
      format.html {render :layout => 'application'}
    end
  end

আমার কাছে এটি আরও নমনীয় উত্তর। layout "[...]" to the controller class only allows one statement effectively. If you have more than two layouts to deal with (say, admin, generic_app, tailored_app), you will experience রেন্ডার প্রয়োগ করে এবং / বা পুনর্নির্দেশের মাধ্যমে জিনিসগুলি DRYing করা এই ক্রিয়াকলাপে একাধিকবার বলা হয়েছিল `ত্রুটিগুলি; এবং আপনার এই পরামর্শটি ব্যবহার করা ছাড়া কোনও বিকল্প নেই।
জেরোম

1
এই উত্তরটি সেরা, এর সাদামাটা এবং ঝরঝরে হিসাবে স্যুইচযুক্ত পদ্ধতি ব্যবহারের বিপরীতে বা যদি ভিতরে বিবৃতি দেয়।
কেভ

এছাড়াও এটি erb ফাইল এবং লেআউট উভয়ই নির্দিষ্ট করতে পারে: format.html { render 'custom_index', layout: 'application' } একইভাবে।
thatway_3

12

রেন্ডার ব্যবহার করে আপনি ক্রিয়াটির জন্য বিন্যাসটিও নির্দিষ্ট করতে পারেন:

def foo
  render layout: "application"
end


7

নিয়ামকের অধীনে বিন্যাস নির্দিষ্ট করার বিভিন্ন উপায়:

  1. নিম্নলিখিত কোডে, অ্যাপ্লিকেশন_1 লেআউটটিকে সূচীর আওতায় ডেকে আনা হয় এবং ব্যবহারকারীর কন্ট্রোল শো এবং অ্যাপ্লিকেশন লেআউট (ডিফল্ট লেআউট) অন্যান্য ক্রিয়াকলাপের জন্য বলা হয়।

    class UsersController < ApplicationController
      layout "application_1", only: [:index, :show]
    end
  2. নিম্নলিখিত কোডগুলিতে, ব্যবহারকারীগণের নিয়ন্ত্রকের সমস্ত ক্রিয়াকলাপের জন্য অ্যাপ্লিকেশন_1 লেআউটকে বলা হয়।

    class UsersController < ApplicationController
       layout "application_1"
    end
  3. নিম্নলিখিত কোডে, অ্যাপ্লিকেশন_1 লেআউটটি কেবলমাত্র ব্যবহারকারীদের নিয়ন্ত্রণকারীদের পরীক্ষা করার জন্য এবং অন্য সমস্ত ক্রিয়াকলাপের জন্য লেআউট (ডিফল্ট) বলা হয় called

        class UsersController < ApplicationController
          def test
            render layout: "application_1"
          end
        end

5

যথার্থতা:

আপনি উপরে যা দেখছেন তা সত্যই নয় তবে কার্যকর ডিআরওয়াই উপায়: তবে একটি নির্ভুলতার সাথে: কাজ করার জন্য লেআউটটি আপনার ভেরিয়েবলের পরে হওয়া দরকার ("@ কিছু")। যেমন:

def your_action
   @some = foo
   render layout: "your_layout"
end

এবং না :

def your_action
   render layout: "your_layout"
   @some = foo
   @foo = some
end

আপনি যদি পূর্বের কাজটি করেন ... তবে এটি কার্যকর হবে না।

আশা করি এটা সাহায্য করবে.

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.