所以我,一个铁杆新手,我正在尝试从当前的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上有一些类似的问题,但没有一个真正适用于我或帮助过我。
提前致谢!
答案 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.id
或current_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