视图中的@user vs current_user

时间:2018-01-07 02:35:50

标签: ruby-on-rails ruby-on-rails-5

我仍然是Rails的新手,我不理解为什么我无法在自定义视图模板中访问@user。但是当它在诸如show, edit, update, destroy

之类的标准动作中被调用时,它的工作完全正常

例如我创建了这条路线

get 'mygroups' => 'users#mygroups'

在users_controller中我添加了

  def mygroups
    @user = User.find(params[:id])
  end 

然后我在Users下创建了一个名为mygroups.html.erb的新视图模板,并将其添加到视图中

<%= @user.first_name %>

我收到错误说

Couldn't find User with 'id'=

我有一个current_user对象虽然我可以在视图中使用而没有任何问题。

<% current_user.first_name %>

我只是不明白为什么我无法在@user方法中加载mygroups对象,以便在mygroups.html.erb模板中显示它。使用current_user而不是@user有什么缺点吗?用户控制器如何显示,更新等...通过调用@user = User.find(params[:id])来加载@user,但它不在我的方法中?

2 个答案:

答案 0 :(得分:2)

我猜测您何时访问mygroups路由时,您未传入ID,因此错误消息显示该消息为空白。默认的CRUD用户操作(显示,更新等)都将设置路由以期望id,并且任何指向这些操作的链接(或表单URL等)都将通过相关用户ID。

在这个意义上,@usercurrent_user之间的区别在于current_user通常是基于当前会话的经过身份验证的用户。但是,用户控制器中的@user是正在对其执行操作的用户。想象一下,您有一个应用程序,其中current_user是某种管理员,并且该管理员可以创建,读取,更新和销毁其他用户。正在执行的@user是特定用户,而不是当前经过身份验证的用户。

如果您确定希望它适用于任何用户,请尝试使用ID mygroups访问您的/mygroups?id=USER_ID路由 - 如果您只想要它为当前用户工作,丢失User.find查找并改为使用current_user。

希望有所帮助!

答案 1 :(得分:1)

current_user几乎总是(99%的时间)当前登录用户。此方法在ActionController中定义(在您的情况下为幕后)。

您的错误消息表明没有id参数,无论是通过POST参数还是查询字符串中的参数。

由于您是Rails的新手,您可能会发现经典的Rails教程非常有用。 https://www.railstutorial.org/