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.fetchparams[:chapter]のときに例外が発生しないようにしますnil

于 2013-02-26T03:25:37.620 に答える