[英]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.