我想在停用用户后一次禁用所有用户链接。所以,为此,我写了一个像这样的代码
def link_to(*user)
if user_link_disabled?(user.id)
return nil
else
super
end
end
def user_link_disabled?(user_id)
User.where(activation: false).pluck(:name).include?(user_id)
end
但我收到此错误
undefined method `id' for #<Array:0x007efee4667d00>
有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
我会在您的用户模型中添加一列:
停用=&gt;输入boolean
user.deactivated? #will return true or false
在您的视图中,您可以使用link_to_unless
link_to_unless(user.deactivated, name, options = {}, html_options = {}, &block)
答案 1 :(得分:0)
我不知道范围,因为你没有显示任何信息,但它可能只是if语句中的user_id或尝试id [params [:id]而不是user.id但我不确定没有更多的背景。
答案 2 :(得分:0)
以下方法
def user_link_disabled?(user_id)
User.where(activation: false).pluck(:name).include?(user_id)
end
您将从用户表记录中选择name
,但您正在检查include?
user.id
,我认为您应该id
而不是name
答案 3 :(得分:0)
首先,我不会评论您覆盖link_to
帮助程序的首选代码/方法。没有太多可用的背景。
但要解决您遇到的特定错误:
您正在定义此方法def link_to(*user)
。
这里*user
意味着它期望Array
作为方法的参数并使用Ruby splat(*),它将它转换为普通参数。
因此,如果将其称为link_to [1,2,3]
,则与调用具有3个参数的方法相同。那是link_to (1,2,3)
但参数user
将是一个数组。
所以在这里if user_link_disabled?(user.id)
,您在id
数据类型上调用Array
。这就是你收到错误的原因。
根据您的使用情况,从方法定义
*
或
如果要将多个用户数据传递给方法,请使用循环,例如:
def link_to(*user)
user.each do |u|
if user_link_disabled?(u.id)
return nil
else
super
end
end
end
正如我在开始时提到的,我对背景知之甚少。因此无法对正确的方式发表评论,但如果我建议,那么我建议对所有用户路由使用自定义帮助程序。如下伪代码:
def link_to_user(user)
deactivated = user.deactivated?
if deactivated
# render some disabled link
else
# render link
end
end