如何将rails初始化程序转换为模块或关注点

时间:2014-11-05 13:54:55

标签: ruby-on-rails module

我现在在初始化程序中有一组身份验证功能。这意味着每次我需要进行更改或调试时,我都需要重新启动开发服务器以查看更改。我想现在是时候把代码放在更动态的地方了。我的想法是一个模块。麻烦的是我在控制器和视图中使用这些功能。我想我可以将函数包含在控制器中,但它们在视图中显示为未定义的方法。有人能告诉我轨道方式吗?

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'

另一个例子是在菜单栏中试图显示用户名。这是视图/布局中的片段

1 个答案:

答案 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首字母缩略词。