ভঙ্গিতে সাইন_অন ক্রিয়াটির জন্য বিভিন্ন লেআউট


84

আমি সাইন_অ্যাকশনটির জন্য "ডিভাইস" নামে একটি ভিন্ন / কাস্টম বিন্যাস ব্যবহার করার চেষ্টা করছি। আমি এই পৃষ্ঠাটি উইকিপিডিয়ায় খুঁজে পেয়েছি এবং দ্বিতীয় উদাহরণটি এমনকি বলছে যে আপনি এটি প্রতি-ক্রিয়া করতে পারেন (এই ক্ষেত্রে, sign_inক্রিয়া), তবে এটি করার কোনও উদাহরণ দেখায় না। আইআরসি-র একজন আমাকে বলেছিলেন আমি এটি চেষ্টা করতে পারি:

class ApplicationController < ActionController::Base
  protect_from_forgery

  layout :layout_by_resource

  def layout_by_resource
    if devise_controller? && resource_name == :user && action_name == 'sign_in'
      "devise"
    else
      "application"
    end
  end
end

এটি এখনও ডিফল্ট অ্যাপ্লিকেশন বিন্যাসটি লোড করায় এটি কাজ করছে বলে মনে হচ্ছে না। আমি কোন সাহায্য কৃতজ্ঞ হবে।

উত্তর:


96

কোনও ক্রিয়াকলাপের জন্য কাস্টম বিন্যাস প্রয়োগ করার আরেকটি উপায় নিম্নরূপ।

কীভাবে করবেন: কাস্টম লেআউটগুলি তৈরি করুন অনুসারে "আপনি কনফিগারেশন / এনভায়রনমেন্ট.আরবি (রেল 2) বা কনফিগারেশন / অ্যাপ্লিকেশন.আরবি (রেল 3) এ কলব্যাক ব্যবহার করে নির্দিষ্ট ডিভাইস কন্ট্রোলারের জন্য লেআউট সেট করতে পারেন This এটি একটিতে করা দরকার to_prepare কলব্যাক কারণ এটি একবার উত্পাদন এবং প্রতিটি অনুরোধ বিকাশের আগে সম্পাদিত হয় ""

config.to_prepare do
    Devise::SessionsController.layout "devise"
    Devise::RegistrationsController.layout proc{ |controller| user_signed_in? ? "application"   : "devise" }
    Devise::ConfirmationsController.layout "devise"
    Devise::UnlocksController.layout "devise"            
    Devise::PasswordsController.layout "devise"        
end

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

config.to_prepare do
    Devise::SessionsController.layout proc{ |controller| action_name == 'new' ? "devise"   : "application" }
end

আমি মনে করি এপ্লিকেশনকন্ট্রোলারের সাহায্যকারী তৈরির পরিবর্তে নকশাকর্তা নিয়ন্ত্রক / ক্রিয়নের ভিত্তিতে লেআউটটি পরিবর্তন করার পক্ষে এটি সর্বোত্তম এবং অন্তর্নির্মিত।


4
এছাড়াও প্রতিবার পরিবর্তনগুলি প্রভাবিত করার জন্য, কনফিগারেশন ফোল্ডারের কোনও ফাইল পরিবর্তন করার সময় প্রতিবারই সার্ভারটি পুনরায় চালু করতে ভুলবেন না R
জিশান

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

উপরের উদাহরণে, আলাদা ডিভাইস রিসোর্সের জন্য লেআউটগুলি কনফিগার করা কি সম্ভব (উদাহরণস্বরূপ, চলুন আমরা
ভেবে

আমি এটি চেষ্টা করার পরে, আমি একটি ত্রুটি পেয়েছি যে এটি এখন দুটি অবস্থান থেকে টেমপ্লেট পাওয়ার চেষ্টা করছে। ডিভাইসের আগের সেটিংসকে ওভাররাইড করার জন্য কীভাবে রেলগুলি পাবেন?
অ্যাডাম গ্রান্ট

যারা এটি মিস করেছেন তাদের জন্য - রেল 3 সেটআপ আলাদা - এটি করুন: কনফিগারেশন / অ্যাপ্লিকেশন.আরবি (রেল 3)।
প্রস্তর

66

আমি স্রেফ অ্যাপ / ভিউ / লেআউট / ডিজাইস / সেশনস html.erb তৈরি করেছি এবং আমার লেআউটটি সেখানে রেখেছি।


28
দুর্দান্ত সমাধান! এছাড়াও আপনি /app/views/layouts/devise.html.erb একটি বিন্যাস করা এবং এটি প্রযোজ্য হতে পারে সব আপনার উইল মতামত
বাস্তি

45

আমি এটি বের করেছিলাম, তবে অন্যান্য লোকেরা যদি কৌতূহলী হয় তবে আমি এই প্রশ্নটি এখানে রাখব।

এটি একটি বোকা ভুল ছিল। আসলে হয় sign_inপাথ, হয় না কর্ম। এ খুঁজছি প্রাসঙ্গিক উৎস , আমি দেখতে পারেন প্রয়োজনীয় কর্ম new, অর্থাত্, একটি তৈরি নতুন উইল সেশন। আমার উপরের কোডের শর্তসাপেক্ষে এই পরিবর্তন করা:

if devise_controller? && resource_name == :user && action_name == 'new'

সুন্দর কাজ করে।

আশা করি সেখানকার কাউকে সাহায্য করবে।


এটি # নতুন এবং সেশন # নতুন উভয় নিবন্ধের জন্য বিন্যাসটি প্রয়োগ করবে না?
আয়রাদ

13

সবচেয়ে সহজ সমাধানটি হ'ল আপনার অ্যাপ / ভিউ / লেআউট ফোল্ডারে কেবল ডিভাইস.ইচটিএমএল.এলএল নামের একটি লেআউট তৈরি করা। এবং রেল যাদু বাকিগুলির যত্ন নেয়।

app/views/layouts/devise.html.haml

4
এটি নকশাকরণের জন্য একটি বিন্যাস সেট করার খুব সহজ উপায়। ধন্যবাদ!
phlegx

8

এইভাবে আমি এটি করেছি। যদি ব্যবহারকারীকে সাইন ইন করতে হয় তবে আমি একটি ভিন্ন লেআউট চেয়েছিলাম, তবে ব্যবহারকারীকে তার প্রোফাইল সম্পাদনা করতে হলে একটি ভিন্ন লেআউট।

আমি রেলগুলি ব্যবহার করছি 4.1.1

অ্যাপ্লিকেশন নিয়ামকটিতে এটি যুক্ত করুন:

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception
  before_action :configure_permitted_parameters, if: :devise_controller?

  layout :layout_by_resource

  # Define the permitted parameters for Devise.
  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:firstname, :lastname, :email, :password, :password_confirmation)}
    devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:avatar, :firstname, :lastname, :email, :password, :password_confirmation, :current_password) }
  end

  def layout_by_resource
    if devise_controller? and user_signed_in?
      'dashboard'
    else
      'application'
    end
  end
end

7

এই উত্তরটি কোথাও না দেখে অবাক হলেও আপনি এটিও করতে পারেন:

রুট.আরবিতে, এর মতো কিছু দেখতে আপনার ছদ্মবেশী কনফিগারেশনটি পরিবর্তন করুন:

  devise_for :users, controllers: {
    sessions: 'sessions'
  }

তারপরে অ্যাপ / কন্ট্রোলার / সেশন_কন্ট্রোলআরআরবিতে

class SessionsController < Devise::SessionsController
  layout 'devise', only: [:new]
end

এটি বিশেষত কার্যকর যদি আপনার কোনও ডিভাইস নিয়ন্ত্রকদের অতিরিক্ত যুক্তি ওভাররাইড করার প্রয়োজন হয়।


4
আমি ঠিক এইটাই খুঁজছিলাম! অন্য কারও কারও জন্য কোনও কারণে কাজ করা হয়নি: /
ডিজেগ্রিল

1

কেবলমাত্র যদি আপনি জানেন না rake routesতবে আপনি নিজের রেল অ্যাপ্লিকেশনটির রুটগুলি যে ম্যাপটি অনুসরণ করেন সেগুলি / কন্ট্রোলারের সাথেও এটি ব্যবহার করতে পারেন।

 new_user_registration GET    /accounts/sign_up(.:format)       {:action=>"new", :controller=>"devise/registrations"}
edit_user_registration GET    /accounts/edit(.:format)          {:action=>"edit", :controller=>"devise/registrations"}
                       PUT    /accounts(.:format)               {:action=>"update", :controller=>"devise/registrations"}
                       DELETE /accounts(.:format)               {:action=>"destroy", :controller=>"devise/registrations"}

ধন্যবাদ, আমি আসলে রেকের রুটগুলি সম্পর্কে জানি / জানি না, আমি কেবল একটি সেকেন্ডের জন্যও ভাবিনি যে 'সাইন_ইন' আসল ক্রিয়াটির নাম নাও হতে পারে, আমি বুঝতে পেরেছিলাম এটি হবে, তখন আমি বুঝতে পেরেছিলাম যে এটি সমস্ত সেশনের চারদিকে ঘোরে ves যে কারণে এটি নতুন কর্মের সাথে সম্পর্কিত s
জোর্জে ইস্রায়েল পেঁয়া

0

যারা নতুন লেআউটটি ব্যবহার করতে সমস্ত কৌশল অবলম্বন করতে চান তাদের জন্য এখানে একটি ওয়ান-লাইনার রয়েছে:

class ApplicationController < ActionController::Base
  protect_from_forgery

  layout Proc.new { |controller| controller.devise_controller? ? 'devise' : 'application' }
end
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.