如何向我的before_action添加异常处理

时间:2014-11-12 11:53:46

标签: ruby-on-rails ruby

我有before_action这样的方法:

def current_user
  @current_user ||= User.find(:id => session[:id])
end

我称之为这样的方法:

def get_food user
  food = Food.find(:id => user.id)
end

这很好,但我想添加异常处理。

当用户为零时,我想使用@current_user

def get_food user
  food = Food.find(if user is nil i want to use @current_user.id)
end

当然,我可以这样写:

def get_food user
  if user.nil?
    food = Food.find(@current_user.id)
  else
    food = Food.find(user.id)    
end

或者,这是最好的方法吗?

def get_food user
  food = Food.find(user == nil? @current_user.id : user.id)
end

我很好奇有没有比在param中添加简单if语句更好的方法?

6 个答案:

答案 0 :(得分:4)

我能想到的最短的一行是这样的:

Food.find((user || current_user).id)
Food.find(user.try(:id) || current_user.id)
Food.find(user ? user.id : current_user.id)

不确定这是否真的是可读性的推动力。我更喜欢这样的事情:

def get_food(user)
  user ||= current_user
  Food.find(user.id)
end

答案 1 :(得分:0)

您可以使用三元运算符使其成为一行:

user ? Food.find(user.id) :  Food.find(@current_user.id)

答案 2 :(得分:0)

arrays

怎么样?
food = Food.where(id: [@current_user.try(:id),user.id]).first

答案 3 :(得分:0)

你可以试试这个:

food = Food.find(user.nil? ? @current_user.id : user.id)

答案 4 :(得分:0)

默认参数怎么样?

def get_food(user = @current_user)
  food = Food.find(user.id)
end

如果您在没有参数

的情况下调用它,它将起作用
something.get_food # notice the method is called with no params

如果您希望它通过nil也能正常工作,您还应该添加:

def get_food(user = @current_user)
  food = Food.find((user || @current_user).id)
end

但奇怪的是食物和使用者有相同的ID ... 也许正确的查询是:

food = Food.find_by_user_id((user || @current_user).id)

或者,如果用户只有一种食物:

foods = Food.where(user: (user || @current_user)) # rails 4, :user => (user || @current_user) for rails 3

答案 5 :(得分:0)

Food.find(user.id rescue @current_user.id)