新手问题 请问在 helper 里面放查询语句合适吗?

beihuiguixian · 2012年09月10日 · 最后由 beihuiguixian 回复于 2012年09月10日 · 2198 次阅读

会不会影响性能? 我在 application_helper.rb 里面放这些感觉别别扭扭的,请问最佳实践应该是什么


module ApplicationHelper
  def user_info(user_id)
    user = User.find_by_id(user_id)
    unless user
      return
    end
    user_info = {id:user.id, username:user.username}
  end
end

这个放在 user.rb Model 里最合适

返回的东西好奇怪。。为啥要返回一个 hash? 会直接对象扔回去不好么

非要返回 hash 的话也可以写得简单点

def user_info user_id
 user = User.find_by_id(user_id)
 {id:user.id, username:user.username} if user
end

user_info 的 argument 应该为 user object。

def user_info(user)
  {
    :id => user.id,
    :username => user.username
  } unless user.nil?
end

进阶一步的话,可以把这个重构到 decorator 里。

class User
  def user_info
    {
      :id => self.id,
      :username => self.username
    } 
  end
end

#1 楼 @fresh_fish #2 楼 @ywencn #4 楼 @fredwu

弄这个的目的是:我想在 layout view 里面得到用户名,但是我的 session 里面只有 user_id,就弄这个方法返回。应该有更好的方式吧?放在 ApplicationController 里如何?

session[:user_id] = 当前登陆的 User 的 id,你在 layout 里写一个<%= session[:user_id] %>(如果在登陆情况下应该是返回登陆的这个用户的 id.)

User.find_by_id(session[:user_id]).user_name

#8 楼 @metal 也许是我没说清楚,我的 session[:user_id] 是 id 主键

搞一个 current_user 放在 application_controller.rb 里

def current_user    
  @current_user ||= begin
    login_from_session || login_from_cookie
  end

  # @current_user ||= begin
  #   User.current = (login_from_session || login_from_cookie)  
  # end
end

# Store the given user id in the session.
def current_user=(new_user)
  session[:user_id] = new_user ? new_user.id : nil
  @current_user = new_user || nil
end

def login_from_session
  self.current_user = User.where(:_id => session[:user_id]).first if session[:user_id]
end

def login_from_cookie
  nil
end
需要 登录 后方可回复, 如果你还没有账号请 注册新账号