2

我有一个用户视图和一个出租视图。在我的出租视图中,我试图显示当前用户的姓名。我想我已经很接近了,但我无法解决最后一点。

这会在选择列表中返回我的所有用户

<%= 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 还很陌生,我可能会以完全错误的方式解决这个问题。任何帮助深表感谢。

4

3 回答 3

0

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

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

然后在视图中调用该方法或类似的方法(我不知道您在这里要做什么):

<% user(current_user.id) %>

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

<%= f.select :user_id, [[@user.name, @user.id]] %>
于 2012-11-23T00:33:18.603 回答
0

认为你应该能够做到:

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

不过,这对我来说似乎有点奇怪。我也想过:

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

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

于 2012-11-23T00:36:30.883 回答
0

我假设您有一个出租对象,您为此显示表单,我假设它是一个实例变量@rental,此外我假设您的Rental类内部存在以下关系

class Rental

  belongs_to :user

end

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

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

希望这可以帮助。

user_name在一个相关但不太重要的注意事项上:有一个名为a的列真的很奇怪user:我会称该列为name,因为它无论如何都是用户的一部分。

于 2012-11-23T02:09:46.957 回答