2015-10-16 247 views
2

我需要设计和使用多个模型的选项的帮助。Rails设计 - 多个模型

目前,我得到了一个用户模型和客户模型,该模型是一个命名空间内:

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :recoverable, :registerable, :rememberable, :trackable, :validatable 
end 

class Test::Client < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable 
end 

正如你可以看到,我包括设计在两个模型。就像它在doc ..

所以看看我路线

devise_for :users, controllers: {passwords: 'passwords', 
           sessions: 'sessions'} 

devise_for :clients, class_name: 'Test::Client', controllers: {sessions: 'test/sessions'} 

我现在的问题是,当我创建一个登录表单我客户型号:

<%= form_for(resource, as: resource_name, url: client_session_path(resource_name), html: {class: ''}) do |f| %> 
<% end %> 

它具有以下网址:/clients/sign_in.client

这是什么。客户端?它让我疯狂。当你需要更多的信息,让我知道..

编辑1:

我现在编辑我的模型结构。

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :recoverable, :registerable, :rememberable, :trackable, :validatable 
end 

class Test::Client < User 
    # some Client only functions 
end 

因此,作为普通用户的登录工作。但客户登录仍然没有。在我看来,我这样做:

<%= form_for(Test::Client.new, as: :client, url: session_path(:client) 

当我输入我的凭据我重定向到“/用户/ sign_in”,但没有别的happend。在我的日志我有一个过滤器条目:

Filter chain halted as :require_no_authentication rendered or redirected 
+0

为什么不STI? 'class Test :: Client

+0

@huanson我已经试过了。但后来我得到的问题,对象总是输入*用户*,但我需要*客户端*方法等 – Zero

+0

你好,你仍然有用户和测试::客户端和客户端,你可以扩展一切。但仍然只是一个登录和1路由 –

回答

1

回答原来的问题
在我的应用程序

<%= user_session_path(resource_name) %> 
# Output 
/users/sign_in.user 
# In this example; the `resource_name` is redundant 

<%= user_session_path %> 
# no need to pass arg is your are surely gonna use `user` as the resource 
# Output 
/users/sign_in 

<%= session_path(:user) %> 
# Output 
/users/sign_in 

存在色器件定义根据资源来确定sign_in_url一个辅助方法;

这是什么.client? Ans:client是您为devise定义的资源的名称;在你的情况下有两个资源;

如果您将针对不同的资源使用不同的视图模板,请使用以下内容;

<%= form_for(resource, as: resource_name, url: client_session_path, html: {class: ''}) do |f| %> 
<% end %> 

如果要共享视图模板;使用

<%= form_for(resource, as: resource_name, url: session_path(resource_name), html: {class: ''}) do |f| %> 
<% end %> 

FYI:

[8] pry(main)> app.members_path 
=> "/members" 
[9] pry(main)> app.leads_path(2) 
=> "/leads.2" 
[10] pry(main)> app.lead_path(2) 
=> "/leads/2" 
+0

感谢您的回答。我现在可以登录,但我无法访问用户。 Current_user是空的。当我尝试登录消息“你已经登录”出现。 – Zero

+0

怎么来了;如果您登录,则必须设置'current_user';可以分享您的错误日志请 – illusionist

+0

哦;因为你正在使用'client'资源;不设置'current_user';尝试'current_client' – illusionist