0

我有一组由用户书籍章节组成的嵌套资源。这是它的外观。

楷模

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。我对 Web 开发非常陌生,所以我可能会在这里做一些疯狂的事情。任何帮助将不胜感激。我真的很想让这个工作。

编辑:为了更详细地说明我所说的“章节资源没有获得它需要的用户 ID” - 在章节模型中我写了 *validates :user_id,presence:true*。当我在章节创建页面上按下提交按钮时,它会给出一个错误,提示 user_id 不能为空。

4

2 回答 2

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?然后将在 User 模型上current_user实现,并将在ApplicationController.

于 2013-02-26T02:55:44.843 回答
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

于 2013-02-26T03:25:37.620 回答