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

但是当参数被传递给页面控制器时 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

调试此问题的一种方法是在控制器中使用“puts”作为参数来查看实际存在的内容。“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 回答
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 Guides on 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 回答