我有几本用户可以创建的书籍,然后为他们创建页面。
routes.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被保留。
这是我的第一个应用程序,所以我甚至不确定这是否是接近它的正确方法......我怎样才能让它工作?
谢谢你们!
答案 0 :(得分:0)
调试此方法的一种方法是在控制器中使用“puts”来查看params以查看实际存在的内容。 “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
答案 1 :(得分: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关联以及如何通过the Rails Guides on ActiveRecord associations中的关联构建和创建对象的所有信息。希望这些指针有所帮助。
如果你想调试传入的参数,你可以按照上面建议的C404来提升它们。
# in any controller
def any_method
raise params.inspect
# or in yaml format
raise params.to_yaml
end