在我的应用程序中,有用户,列表和书籍。书籍属于列表,列表有很多书籍。我想要做的是让用户创建一本新书,并选择将书放在该表格中的列表。我试图使用formtastic。到目前为止,这是我的代码:
<%= semantic_form_for(@book) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<%= f.input :list, :as => :select, :collection => List.find(:all, :order => "name ASC") %>
<%= f.text_field :title, class: 'form-control', placeholder: "Book title" %>
<%= f.text_field :pages, class: 'form-control', placeholder: "# of pages" %>
<%= f.text_field :author, class: 'form-control', placeholder: "Author" %>
<%= f.submit "Add book", class: "btn btn-default green-hover" %>
<% end %>
问题是我得到undefined method 'books_path' for #<#<Class:0x007fbe29898688>:0x007fbe29812da8>
。但我认为我的routes.rb文件是正确的:
resources :users do
resources :lists, shallow: true do
resources :books, shallow: true
end
end
我怎么会收到这个错误?
修改
我改变了我的路线:
resources :users do
resources :lists, shallow: true
end
resources :books
现在表格呈现。但是,当我尝试提交它时,它不起作用:undefined local variable or method 'list' for #<BooksController:0x007fbe27cd6eb8>
。如何从控制器中的创建操作访问哪个列表被选中?
编辑2
以下是我提交b Parameters: {"utf8"=>"✓", "authenticity_token"=>"OaMLlxWbhfBmyYuofNoLv3SfYmh44DzpB+fvHJDqojw60fKRsk2JoSn8LCDxkumyGsOVMGkepiPP2f+T9PDBqA==", "book"=>{"list_id"=>"1", "title"=>"Example", "pages"=>"100", "author"=>"Example"}, "commit"=>"Add book"}
答案 0 :(得分:1)
我认为你的嵌套资源使它变得比它需要的更复杂。最佳做法是不要将资源嵌套到多个深度(http://guides.rubyonrails.org/routing.html#limits-to-nesting),但除非您有特定的嵌套原因,否则请保持资源不嵌套,如下所示:
resources :users
resources :lists
resources :books
如果你使用这样的非嵌套路线,你已经拥有的应该只是工作。 Formtastic旨在更好地处理这样的路线。如果您绝对必须拥有嵌套的资源,那么您将不得不告诉Formtastic要手动发布哪条路线,如下所示:
<%= semantic_form_for(@book, url: list_books_path({your_list_id_here}) do |f| %>