链接 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
希望能帮到你
我有一个登录用户配置文件,每个配置文件都有自己的 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
希望能帮到你