如何在Rails中的ruby模型中编写自定义函数?

时间:2018-12-04 12:12:48

标签: ruby-on-rails ruby

我有一个用Devise创建的User模型类。

我的模型中有一个角色字段(admin = 0,user = 1)。

我的数据库的屏幕截图:

Screenshot of my database

HTML视图

<% if current_user.active_admin? %>
  <%= render 'layouts/admin' %>   
<% else %>
  <%= render 'layouts/user' %>
<% end %>

型号

def active_admin?
   #your logic here
end

我要登录。如果我是管理员检查角色,则为0渲染到布局/管理员。否则,我是用户检查角色是1,渲染到布局/用户。

我该如何在模型中编写代码来做到这一点?

5 个答案:

答案 0 :(得分:3)

在您的user.rb文件中:

class User < ActiveRecord::Base
  def active_admin?
    role == 0
  end
end

您认为:

<% if current_user.active_admin? %>
  <%= render 'layouts/admin' %>   
<% else %>
  <%= render 'layouts/user' %>
<% end %>

答案 1 :(得分:2)

正如Mark所说,您可以只检查role的0或1。

数据库中的任何列都将直接映射到模型上的方法。

几点:

  • 如果您使用的是Rails 5,则需要继承自ApplicationRecord而不是ActiveRecord::Base
  • 在较新版本的Ruby中,您可以使用#zero?方法:
class User < ApplicationRecord
  def active_admin?
    role.zero?
  end
end

答案 2 :(得分:1)

无需添加检查角色的方法,您可以通过以下更改直接实现此目的。对于除0以外的任何值,它将返回true。

<% if current_user.role? %>
  <%= render 'layouts/user' %>        
<% else %>
  <%= render 'layouts/admin' %> 
<% end %>

答案 3 :(得分:1)

一种方法可以在应用程序控制器上添加一个方法

  def after_sign_in_path_for(resource_or_scope)
    if current_user.role==0
      #your admin path
    else
      root_path
    end
  end


  def authenticate_admin
    unless (user_signed_in? and current_user.role !=0 )
      redirect_to '/users/sign_in'
    end
  end

添加到所需的控制器

  before_filter :authenticate_admin
  layout 'admin'

答案 4 :(得分:-1)

在不使用模型的情况下尝试在HTML中

<%if  current_user.role==0 %>
<%=  render 'layouts/admin' %>
<%else%>
<%=  render 'layouts/user' %>
<% end %>