簡體   English   中英

如何將Rails初始化程序轉換為模塊或關注點

[英]How to convert an rails initializer into a module or concern

我現在在初始化器中擁有一組身份驗證功能。 這意味着每次我需要進行更改或調試時,都需要重新啟動開發服務器以查看更改。 我想是時候將代碼放在更具動態性的地方了。 我的想法是一個模塊。 問題是我在控制器和視圖中都使用了這些功能。 我想我可以將功能包含在控制器中,但是它們在視圖中顯示為未定義的方法。 有人可以告訴我這樣做的方法嗎?

auth機制正在從舊版PHP系統中查找cookie集,以避免再次登錄Rails中完成的新代碼。

一切都可以很好地用作初始化程序。 為了隱蔽一個模塊,我只是將初始化代碼包裝在module BtrSSO ,將其移動到lib文件夾,然后開始將其包含在控制器中。

config / initializers / btr_sso.rb

  def logoutSSO
    cookies.delete :BTR_SSO
    session[:sso_options] = nil
  end

  def getSSOShop
   return "" if session[:sso_options].nil?
   session[:sso_options][:ediv]
  end

def getSSOUserName
  return "Not Logged In" if session[:sso_options].nil?
  session[:sso_options][:sysname]
end

def getSSOIsManager
  return false if session[:sso_options].nil?
  session[:sso_options][:is_mgr]==true
end

def setSSO(employee)
  #logger.debug employee.inspect
  return if employee.nil?
  #logger.debug "After employee nil check"
  logger.info "setting cookie with #{employee.sysname} {employee.ediv}"
  cookie_stuff = Hash.new
  cookie_stuff[:sysname] = employee.sysname
  cookie_stuff[:ediv] = employee.ediv

  cookies[:BTR_SSO] = {
    :value => cookie_stuff.to_json,
    :expires => 1.week.from_now,
    ## required on production I think
    #        :domain => 'mydomain.com'
  }
  logger.debug employee.inspect
  #should this be in the sessions controller?
  session[:sso_options] = Hash.new() if session[:sso_options].nil?
  session[:sso_options][:sysname] = employee.sysname
  session[:sso_options][:ediv] = employee.ediv
  session[:sso_options][:is_mgr] = employee.ismgr
  logger.debug session[:sso_options].inspect
end

def authSSO
  logger.debug session[:sso_options].inspect
  session[:redirect_to] = request.path_info
  redirect_to login_path(nexturl: request.path_info) if session[:sso_options].nil?
end

def is_worker_class
  read_cookie
  unless session[:sso_options].nil?
    session[:sso_options][:sysname] == "worker"
  else
    false
  end
end

def read_cookie
  session[:sso_options] = JSON.parse cookies["BTR_SSO"] unless cookies["BTR_SSO"].nil?
end

該視圖調用未定義的getSSOUserName。

我已經嘗試在application_controller.rb和更直接的控制器中使用“ include BtrSSO”,但是沒有區別。

如果這有所不同,則該視圖位於視圖/布局中。

!!!
%html
  %head
    %meta{:content => "width=device-width, initial-scale=1.0", :name => "viewport"}
      %title= content_for?(:title) ? yield(:title) : "Intranet"
      %meta{:content => content_for?(:description) ? yield(:description) : "Our Intranet", :name => "description"}
        = stylesheet_link_tag "application", :media => "all"
        = javascript_include_tag "application"
        = csrf_meta_tags
        = yield(:head)
        = yield(:javascripts)
  %body{:class => "#{controller_name} #{action_name}"}
    - unless getSSOUserName == "worker"
      = render 'layouts/navigation'
    - else
      = render 'layouts/navigation_worker'
    .uk-container.uk-container-center.buffer-top
      /= render 'layouts/messages'
      = show_flash_messages

      = yield

    = render 'layouts/footer'

菜單欄中的另一個示例嘗試顯示用戶名。 這是視圖/布局中的片段

將其包裝在模塊中,然后將整個文件移至app / helpers文件夾:

# app/helpers/btr_sso.rb

module BtrSso # Name has to match the file name
   # your definitions here
end

輔助程序自動包含在所有視圖上下文中,因此不需要顯式include 如果您更願意為模塊BtrSSO ,請使用變形器首字母縮寫詞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM