【问题标题】:Formtastic Belongs_to association and undefined method '_path'Formtastic Belongs_to 关联和未定义的方法 '_path'
【发布时间】:2015-08-13 18:55:59
【问题描述】:

在我的应用程序中,有用户、列表和书籍。 Books belongs_to 列表,并且列表有很多书。我想做的是让用户创建一本新书并选择将书放在该表单中的列表。我正在尝试使用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 #&lt;#&lt;Class:0x007fbe29898688&gt;:0x007fbe29812da8&gt;。但我认为我的 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 #&lt;BooksController:0x007fbe27cd6eb8&gt;。如何从控制器中的创建操作访问选择了哪个列表?

编辑 2

这是我提交 bParameters: {"utf8"=>"✓", "authenticity_token"=>"OaMLlxWbhfBmyYuofNoLv3SfYmh44DzpB+fvHJDqojw60fKRsk2JoSn8LCDxkumyGsOVMGkepiPP2f+T9PDBqA==", "book"=>{"list_id"=>"1", "title"=>"Example", "pages"=>"100", "author"=>"Example"}, "commit"=>"Add book"} 后出现在控制台中的参数

【问题讨论】:

  • 你的控制器是什么样的?你那里有 book 的实例变量,看起来像 @book = Book.new 吗?
  • @MilesUA 是的,我愿意:@book = current_user.books.build if logged_in?

标签: ruby-on-rails forms drop-down-menu formtastic


【解决方案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| %>

【讨论】:

  • 但这件事是我不知道列表id是什么。我希望用户能够选择将书放在哪个列表中,所以我不知道列表 ID 是什么。
  • 所以我改变了路线,表格出现了。唯一的事情是我需要能够从控制器中找到列表。如何获取用户从控制器中选择的列表?
  • 尝试只使用&lt;%= f.input :list %&gt; 而不使用任何选项。 Formtastic可能只是自己找出关系并让用户从Lists 列表中选择。如果这仍然不起作用,请尝试将其指定为 select,如下所示:&lt;%= f.input :list, :as =&gt; :select %&gt; 如果视图已经很好地呈现您的选择器,请在提交表单后发布您的 params 是什么(您应该看到它在您的日志中,或者在您运行 rails server 的终端中)。
  • 视图渲染得很好。只是在我提交时它给了我一个错误 - 更新了帖子以显示结果。
  • 解决了!非常感谢@spejamchr!
【解决方案2】:

解决了!这就是我所做的:

1) 更改路线:

resources :users do
  resources :lists, shallow: true
end
resources :books

2) 如果我想访问所选列表的 ID:

  • 书籍参数:

    def book_params
        params.require(:book).permit(:title, :author, :asin, :image_url, :pages, :list_id)
    end
    
  • 查找列表:

    @list = List.find(book_params[:list_id])
    
  • 创作书籍:

    @book = @list.books.build(book_params)
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多