链接 Rails 中的两个控制器

Linking two controllers in Rails

我有一个登录用户配置文件,每个配置文件都有自己的 phone-book,其他用户无法访问。问题是我应该如何实施它。将 User 视为一个控制器,将 phone-book 视为另一个控制器,我无法在两者之间建立特定关系用户登录。

我的方法应该是什么?

我有一个单独的用户模型和 phone-book 的单独模型,并使用 has_many 和 [=17 在它们之间建立了关系=]belongs_to宏.

您可能希望将页面放在 /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 指南。

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

class User < ActiveRecord::Base
    has_one :phone_book
end

class PhoneBook < ActiveRecord::Base
    belongs_to :user
end

现在,关于控制器。 当您登录 User 后,您最终将进行 "session thing"。 假设您正在使用 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

最后,如果您希望这些 phone 书籍可供公众阅读,我建议您坚持使用 REST 类型的 URI

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

希望能帮到你