Rails设计:user_signed_in?和current_account

时间:2012-12-04 18:06:38

标签: ruby-on-rails devise sessionid

我在我的Rails应用程序中使用devise进行身份验证。目前我有两种型号:

Users
Accounts

帐户属于用户,用户拥有一个帐户。

我的帐户模型包含名称和子域名。我的用户模型有电子邮件和密码

在account.rb中我有:

class Account < ActiveRecord::Base
  attr_accessible :name, :subdomain

  belongs_to :user

end

在user.rb中:

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable, :Trackable
  attr_accessible :email, :password, :password_confirmation, :account_attributes, :account
  has_one :account
end

我需要在用户登录后从帐户中获取名称和sudbomain等。

在我的application_controller.rb中,我有:

def after_sign_in_path_for(resource)
  if resource.is_a?(User)
    user_path  
  else
    super
  end
 end

  def current_account
    @iduser = session[:user_id]
    @current_account ||= Account.find(@iduser) if @iduser
  end
  helper_method :current_account

并在layout.html.erb

<% if current_account %>
  <%= current_account.name %> <%= current_account.subdomain %>
<% end %>
<% if user_signed_in? %>
  |
  <%= link_to destroy_user_session_path, :class => "btn btn-mini btn-danger", :method => :delete do %>
  <i class="icon-off icon-white"></i> logout
<% end %>
<% end %>

但是,名称和子域名不显示。如何让它们显示?

2 个答案:

答案 0 :(得分:1)

您是否在视图中尝试过此操作:

 <%= current_user.account.name %>
 <%= current_user.account.subdomain %>

您是否正确地将user_id包含在帐户模型中?

不确定你真的需要担心这个助手。在深入研究辅助方法之前,先了解基础知识。

答案 1 :(得分:0)

我认为如果用户有一个帐户,则应该在模型中提及,例如(在用户模型中):

has_one :account

并在帐户模型中:

belongs_to :user

这将在数据库帐户中创建一个名为user_id的列(但如果您正在编辑现有模型,则应通过迁移添加它,然后再进行db:migrate)。然后在帮助程序中,您可以在其中提取名称和子域名,您可以调用:

@current_account = current_user.account

如果您通过用户界面分配user_id,请注意,您应该包含在您的帐户模型中:

attr_accessible :user_id 

编辑:事实上,为包含has_one和belongs_to的模型创建记录需要关联。有关通过关联创建记录的更多信息,您可以read here。您可以考虑阅读nested resources in Rails,这是非常有用的文章。这是关于主题的另一个interesting discussion