我有一组嵌套资源,包括用户,书籍和章节。这是它的外观。
模型
class User
has_many :books, dependent: :destroy
accepts_nested_attributes_for :books, allow_destroy: true
end
class Book
belongs_to :user
has_many :chapters, dependent: :destroy
accepts_nested_attributes_for :chapters, allow_destroy: true
end
class Chapter
belongs_to :book
end
章节控制器
def create
@chapter = @book.chapters.build(params[:chapter])
if @chapter.save
flash[:success] = "A new chapter created!"
redirect_to blah blah
else
render 'new'
end
end
protected
def get_book
@book = Book.find(params[:chapter][:book_id]) ||
Book.find(params[:book_id])
end
您可能想知道为什么我有这种受保护的方法。我试图让用户在单独的页面中创建章节和书籍,并且仍然具有嵌套资源的便利性。因此,用户可以在章节创建页面上创建章节,并通过关联表格将章节与正确的书籍相关联。
目前我被卡住了,因为章节资源没有获得所需的用户ID。我对网络开发很陌生,所以我可能会在这里做一些疯狂的事情。任何帮助将不胜感激。我真的想让它发挥作用。
编辑:要更详细地说明我所说的“章节资源没有获得它需要的用户ID” - 在章节模型中我写了* validates:user_id,presence:true *。当我按章节创建页面上的提交按钮时,它会给出一个错误,指出user_id不能为空。
答案 0 :(得分:1)
我认为Chapter
模型不应检查user_id
是否存在。相反,控制器应该有一个before_filter来检查操作是否被授权给当前用户。
这样的事情:
class ChaptersController < ApplicationController
before_filter :authorized?, only: [:create]
def create
...
end
private
def authorized?
current_user && current_user.owns? Chapter.find(params[:id])
end
end
然后, owns?
将在用户模型上实施,current_user
将在ApplicationController
中实施。
答案 1 :(得分:1)
为了确保当前用户拥有该章,以及本书,请将get_book
方法更改为
def get_book
@book = current_user.books.find(params.fetch(:chapter, {})[:book_id] || params[:book_id])
end
params.fetch
确保params[:chapter]
为nil