Rails嵌套资源创建 - 传递用户ID

时间:2013-02-26 01:35:13

标签: ruby-on-rails

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

模型

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不能为空。

2 个答案:

答案 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

时不会出现异常