在Rails5中停用后禁用User的所有链接

时间:2017-02-28 05:56:57

标签: ruby-on-rails

我想在停用用户后一次禁用所有用户链接。所以,为此,我写了一个像这样的代码

     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>

有人可以帮我解决这个问题吗?

4 个答案:

答案 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