我现在在初始化程序中有一组身份验证功能。这意味着每次我需要进行更改或调试时,我都需要重新启动开发服务器以查看更改。我想现在是时候把代码放在更动态的地方了。我的想法是一个模块。麻烦的是我在控制器和视图中使用这些功能。我想我可以将函数包含在控制器中,但它们在视图中显示为未定义的方法。有人能告诉我轨道方式吗?
auth机制正在寻找旧版PHP系统中的cookie集,以避免第二次登录Rails中的新代码。
作为初始化程序,一切都很有效。为了转换到模块,我只是将初始化代码包装在module BtrSSO
中,将其移动到lib文件夹,然后开始将其包含在控制器中。
配置/初始化/ 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'
另一个例子是在菜单栏中试图显示用户名。这是视图/布局中的片段
答案 0 :(得分:0)
将其包装在模块中并将整个文件移动到app / helpers文件夹:
# app/helpers/btr_sso.rb
module BtrSso # Name has to match the file name
# your definitions here
end
助手会自动包含在所有视图上下文中,因此不需要显式include
。如果您希望命名模块BtrSSO
,请使用inflector首字母缩略词。