使用Devise / Rails获取当前用户的UserID

时间:2015-09-08 17:53:07

标签: ruby-on-rails ruby devise

所以我,一个铁杆新手,我正在尝试从当前的Devise会话中获取用户ID,而且我遇到了一些麻烦。

我现在在控制器中有这个:

def index
  @currentUser = current_user.id
end

我想制作一个简单的if语句来显示/隐藏表单中的字段。

<% if @currentUser === @product.user_id %>
          <%= link_to "Back", products_path %>
          <%= link_to "Edit", edit_product_path(@product) %>
          <%= link_to "Delete", product_path(@product), method: :delete, data: { confirm: "Are you sure?"} %>
      <% else %>
          <span></span>
<% end %>

我觉得我在定义currentUser变量时的语法很糟糕,但我不知道如何解决这个问题。 Stack上有一些类似的问题,但没有一个真正适用于我或帮助过我。

提前致谢!

5 个答案:

答案 0 :(得分:10)

我在这里看到一些问题

def index
  @currentUser = current_user.id
end

除了@HolyMoly已经评论过,你应该使用下划线而不是camelcase,如果current_user在这里为零,.id将失败,导致异常。

其次,您通过比较ID的值来检查“能力”,我会更改您的代码来执行此操作

<% if allow_product_delete?(@product) %>

帮助

def allow_product_delete?(product)
  return false unless current_user
  @product.user_id == current_user.id
end

如果你在控制器和视图中使用devise current_user,则不需要将其定义为实例变量,它已经被定义为所有操作的控制器方法(默认情况下)。所以通过在你的观点中调用current_user,你就完成了。

如果用户未登录,current_user将为零,则您必须为此做好准备并采取防范措施。

最后,我会研究一下能力宝石(cancan或cancancan),那些提供了一个非常好的DSL来处理你在这里尝试的东西。

答案 1 :(得分:3)

您是否将其设置为实际上能够使用current_user? 在您的代码中:

@currentUser = current_user.id

但是current_user定义在哪里?我还没有使用过Devise,但是你可以用会话来定义current_user的值和一个帮助器方法(你也可以在sessions_controller #create方法中做到这一点),如下所示:

 def current_user
     @current_user ||= User.find_by(id: session[:user_id])
  end

然后在整个应用中,您可以使用current_user.idcurrent_user.name或您需要的任何内容。

因此,虽然会议不是Devise,但我希望这会有所帮助。

答案 2 :(得分:2)

首先,ruby喜欢unccored_rather_than camelCased风格。

其次,你需要两个等号而不是三个。 @currentUser == @product.user_id应该有效

第三,你不需要比较整数id,你可以比较模型,类似:

<% if current_user == @product.user %>
  <%= link_to "Back", products_path %>
  <%= link_to "Edit", edit_product_path(@product) %>
  <%= link_to "Delete", product_path(@product), method: :delete, data: { confirm: "Are you sure?"} %>
<% end %>

请注意,我在@方法中省略了current_user,因为current_user是设计的帮手,否则我删除了不必要的<% else %>(在我看来)

答案 3 :(得分:1)

你应该使用current_user。你可以在项目的任何地方做到这一点无需定义变量@currentUser等。

您可以比较相似的模型

if current_user == @product.user

相当于

if current_user.id == @product.user.id

在某些情况下,您可以使用

if current_user.id == @product.user_id

这可以防止额外的SQL查询加载用户模型

如果您使用Devise进行授权,并且您需要控制访问权限,您应该看到(可能使用)gem https://github.com/CanCanCommunity/cancancan

  

https://github.com/airbnb/ruby将帮助您保持协调;)

答案 4 :(得分:0)

比较ID并不是Rails的最佳做法。如果您之前已正确设置关联,那么您不需要在ID之间进行比较。例如:

User
has_many :group_events

GroupEvent
belongs_to :user

在这种情况下,您可以直接与关联进行比较,而不是比较ID:

Bad
@group_event.user_id == current_user.id

Good
@group_event.user == current_user