我想使用带有Ruby on Rails的.find()返回单个结果

时间:2012-11-23 00:07:34

标签: ruby-on-rails ruby ruby-on-rails-3

我有一个用户视图和一个租赁视图。 在我的租赁视图中,我试图显示当前用户的名字。我觉得我很接近,但最后一点我无法理解。

这将返回选择列表中的所有用户

<%= f.select :user_id, User.find(:all).collect {|t|
    [t.user_name, t.id]} %>

这将返回我当前的用户ID

<%= f.number_field :user_id %>

所以我认为我可以做类似

的事情
<%= f.select :user_id, User.find(:user_id).collect {|t|
    [t.user_name, t.id]} %>

我希望仅返回选择列表中的当前用户,其ID为值,并在列表中显示其名称。如果我这样做,它会告诉我

Couldn't find User with id=user_id

所以user_id作为文字字符串传递,但我想传递user_id变量,该变量应该是10个。我不知道如何将user_id作为变量传递。

我对ROR相当新,我可能会以完全错误的方式解决这个问题。非常感谢任何帮助。

3 个答案:

答案 0 :(得分:0)

find()想要一个变量,而不是一个符号。 :all可能不是你想要的。您应该在控制器中编写一个方法,如:

def user(u)
  @user = User.find(u)
end

然后在视图中调用方法或类似的东西(我不知道你在这里尝试做什么):

<% user(current_user.id) %>

然后你将有一个@user对象,你可以玩,即:

<%= f.select :user_id, [[@user.name, @user.id]] %>

答案 1 :(得分:0)

认为你应该能够做到:

<%= f.select :user_id, User.find(f.object.user_id).collect {|t| [t.user_name, t.id]} %>

但这对我来说似乎有些奇怪。我也想过:

  • 您的对象与相关用户有正确关联,在这种情况下,您应该可以f.object.user.user_namef.object.user.id
  • 如果您真的想要当前登录的用户,您可能应该询问您的身份验证框架/代码以供参考。例如。如果您使用的是Devise,那将是current_user

顺便说一句,我真的不明白为什么你想要一个只包含当前用户的选择列表 - 这肯定是你想要实现的,还是我误解了?

答案 2 :(得分:0)

我假设您有一个租借对象,为此您显示表单,我假设它是一个实例变量@rental,而且我假设在Rental类中有以下关系< / p>

class Rental

  belongs_to :user

end

然后你可以写下以下内容:

f.select :user_id, [[@rental.user.user_name, @rental.user.id]]

希望这有帮助。

关于一个相关但不那么重要的注意事项:为user_name创建名为user的列真的很奇怪:我会将该列称为name,因为它是无论如何,用户。