2013-04-03 108 views
0

我有几本用户可以创建的书籍,然后为它们创建页面。为其他控制器创建表单

的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被保留。

这是我的第一个应用程序,所以我甚至不确定这是否是正确的方法来处理它...我如何才能使它工作?

谢谢你们!

+1

我建议你在控制器方法的第一行尝试'raise params.inspect'。你会看到什么是params和哪里。 – C404 2013-04-03 20:34:43

回答

0

嵌套的资源可以以这样的方式来处理运行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 
+0

Thank you!我考虑使用嵌套资源,但我很乐意使用嵌套的资源just/pages /:id而不是/ books /:book_id/pages /:id。你认为这可能吗? – Jonas 2013-04-03 21:02:39

+0

是的!你可以同时拥有两个路由,但应该限制新建路径并创建路径资源嵌套在书本下(因为您将以这种方式很好地获得book_id)。[This answer](http://stackoverflow.com/questions/15420804/what-objects-should-be-passed-to-a-link-to -with-triple-nested-route/15421082#15421082)可能对你有所帮助。随时回来并在需要时询问更多问题。 – 2013-04-03 21:07:25

+0

好吧,只好玩_path(@book,@page)a小,但全部排序,现在去/ page /:id删除书籍ID,但它仍然在数据库。谢谢! – Jonas 2013-04-03 22:53:40

0

调试此方法的一种方法是在控制器中使用“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 
+0

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