0

ユーザーが作成してからページを作成できる本がいくつかあります。

ルート.rb:

resources :books do
  member do
    get 'pages'
  end
end

これにより、/books/:book_id/pages から新しいページを作成するためのリンクが得られます

そのページで私はパーシャルをレンダリングします:

<%= render '/pages/new' %>

ブックコントローラー:

def page
    @book = Book.find(params[:id])
    @page = @book.pages.new
end

しかし、params がページ コントローラーに渡されると、book_id が失われます。

ページコントローラー:

def create
  @page = Page.new(params[:page])
   if @page.save          
     redirect_to @page
   else
     render 'new'
   end
end

また、リダイレクト後に id も消えるため、エラー処理が難しくなります。

コンソールを介してページを作成すると book_id が保持されるため、アプリケーションの残りの部分は問題ないように思われます。

これは私の最初のアプリなので、これがアプローチする正しい方法であるかどうかさえわかりません...どうすればこれを機能させることができますか?

みんなありがとう!

4

2 に答える 2

0

ネストされたリソースは、このような方法で処理できます。

# config/routes.rb
resources :books do
  resources :pages
end

リソース呼び出しでonly: [:index, :new]またはを使用して、作成されるアクションを制限することもできます。except: [:destroy]

あなたPagesControllerには、次のパラメータが用意されています。

GET /books/:book_id/pages/:id => creates a params[:book_id] and params[:id]

# app/controllers/pages_controller.rb
def create
  @book = Book.find(params[:book_id])

  @page = @book.pages.build(params[:page])

  if @page.save
    # ...
  else
    # ..
  end
end

関連付けを介して新しいオブジェクトを構築するためのメソッド呼び出しは、@book.pages.buildではなく であることに注意してください.new。Rails のアソシエーションと、アソシエーションを介してオブジェクトを構築および作成する方法については、 ActiveRecord アソシエーションに関する Rails ガイド を参照してください。これらの指針が役立つことを願っています。

着信パラメーターをデバッグする場合は、上記の C404 で提案されているようにパラメーターを上げることができます。

# in any controller
def any_method
  raise params.inspect
  # or in yaml format
  raise params.to_yaml
end
于 2013-04-03T20:46:44.820 に答える
0

これをデバッグする 1 つの方法は、実際に何が存在するかを確認するために、パラメーターのコントローラーで「puts」を使用することです。「プット」は、Java の println や PHP の echo のようなものです。

このコードで実行したときの params の内容を投稿してください

def create
  puts "params = #{params}"
  @page = Page.new(params[:page])
   if @page.save          
     redirect_to @page
   else
     render 'new'
   end
end
于 2013-04-03T20:36:36.350 に答える