链接Rails中的两个控制器

时间:2015-01-28 19:03:24

标签: ruby-on-rails ruby model controllers

我有一个已登录的用户个人资料,每个个人资料都有自己的电话簿,其他用户无法访问。问题是我应该如何实现它。将用户视为一个控制器而将电话簿视为另一个控制器,我无法在特定用户登录时建立两者之间的关系。

我的方法应该是什么?

我有一个用户的sparate模型和电话簿的单独模型,并使用 has_many belongs_to 宏建立了它们之间的关系。

2 个答案:

答案 0 :(得分:1)

您可能希望将该页面放在/users/:user_id/phone_books/:id

要实现这一目标,

您必须在config/routes.rb中配置路径:

resources :users do
  resources :phone_books
end

app/controllers/phone_books_controller.rb中,找到用户及其地址簿:

class PhoneBooksController < ApplicationController
  before_action :find_user

  def show
    @address_book = @user.address_books.find(params[:id])
  end

  private

  def find_user
    @user = User.find(params[:user_id])
  end
end

有关嵌套资源的详细信息,请参阅Getting Started with Rails指南。

答案 1 :(得分:1)

让我们从模型开始。你说每个User只有只有一个 PhoneBook所以我会说正确的模型应该是:

class User < ActiveRecord::Base
    has_one :phone_book
end

class PhoneBook < ActiveRecord::Base
    belongs_to :user
end

现在,关于控制器。 当您登录User时,您最终会有一个&#34;会话事项&#34;继续 我们假设您正在使用devise,那么您将拥有一个引用登录用户的变量current_user。所以PhoneBooksController将是这样的:

class PhoneBooksController < ApplicationController    
  def index
    @phone_book = current_user.phone_book
  end   
end

当然,如果您的用户可以有多个PhoneBook,我们会回到has_many协会:

class User < ActiveRecord::Base
    has_many :phone_book
end

class PhoneBook < ActiveRecord::Base
    belongs_to :user
end

,控制器变为:

class PhoneBooksController < ApplicationController    
  def index
    @phone_books = current_user.phone_books
  end
  def show
    @phone_book = PhoneBook.find_by_id(params[:id])
  end
end

最后,如果您希望这些电话簿可公开阅读,我建议您坚持使用REST种URI

/phone_books/:id <-- good
/users/:id/phone_books/:phone_book_id <-- too complex

希望我能帮忙