繁体   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