为其他控制器创建表单
我有几本用户可以创建的书籍,然后为它们创建页面。为其他控制器创建表单
的routes.rb:
resources :books do
member do
get 'pages'
end
end
这给出了一个链接,通过/书籍/创建一个新的页面:book_id /页
在该页面渲染我的部分:
<%= 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被保留。
这是我的第一个应用程序,所以我甚至不确定这是否是正确的方法来处理它...我如何才能使它工作?
谢谢你们!
嵌套的资源可以以这样的方式来处理运行post数据的内容。
# config/routes.rb
resources :books do
resources :pages
end
您还可以通过限制对资源的呼叫使用only: [:index, :new]
或except: [:destroy]
正在创建的行动。
在你的PagesController
你会有以下params可用。
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
Thank you!我考虑使用嵌套资源,但我很乐意使用嵌套的资源just/pages /:id而不是/ books /:book_id/pages /:id。你认为这可能吗? – Jonas 2013-04-03 21:02:39
是的!你可以同时拥有两个路由,但应该限制新建路径并创建路径资源嵌套在书本下(因为您将以这种方式很好地获得book_id)。[This answer](http://*.com/questions/15420804/what-objects-should-be-passed-to-a-link-to -with-triple-nested-route/15421082#15421082)可能对你有所帮助。随时回来并在需要时询问更多问题。 – 2013-04-03 21:07:25
好吧,只好玩_path(@book,@page)a小,但全部排序,现在去/ page /:id删除书籍ID,但它仍然在数据库。谢谢! – Jonas 2013-04-03 22:53:40
调试此方法的一种方法是在控制器中使用“puts”参数来查看实际存在的内容。 “把”像的println在java或回声在PHP
时,请使用此代码
def create
puts "params = #{params}"
@page = Page.new(params[:page])
if @page.save
redirect_to @page
else
render 'new'
end
end
puts方法不起作用,所以我用raise params。它返回: {“utf8”=>“✓”,“authenticity_token”=>“CLE1lhmvynv4CkzJuPwuRcBaG0t6IBIE2lym4US6oeE =”,“page”=> {“heading”=>“Heading”,“text”=>“项目无处不在!“},”commit“=>”Create page“,”action“=>”create“,”controller“=>”pages“} – Jonas 2013-04-03 20:55:03
我建议你在控制器方法的第一行尝试'raise params.inspect'。你会看到什么是params和哪里。 – C404 2013-04-03 20:34:43