为什么这种形式认为它应该路由到索引?

时间:2014-09-13 07:43:54

标签: ruby-on-rails simple-form partials acts-as-commentable

我有一个simple_form_for new_comment导致浏览器出现undefined method comments_path'错误,当我只是尝试查看表单时(不提交)

_form.html.slim

= simple_form_for new_comment, :remote => true do |f|

这是部分的,因此传递的局部变量来自hacks scaffold的显示页面

show.html.slim - hacks

= render partial: "comments/form", locals: { new_comment: @new_comment } if user_signed_in?

我在黑客控制器中定义@new_comment

hacks_controller.rb

  def show
    @hack = Hack.find(params[:id])
    @comments = @hack.comment_threads.order('created_at DESC')
    @new_comment = Comment.build_from(@hack, current_user.id, "") if user_signed_in?
                           #build_from is a method provided by the acts_as_commentable_with_threading gem
  end

为什么new_comment想要路由到comments_path?我甚至没有提交表格。

的routes.rb

  root 'hacks#index'

  concern :commentable do
    resources :comments, only: [:create, :update, :destroy]
  end

  resources :hacks, concerns: [:commentable]
  resources :users

  devise_for :users, :skip => [:sessions, :registration]
  devise_for :user,  :path => '', :path_names => { :sign_in => "login", 
                                                  :sign_out => "logout", 
                                                  :sign_up => "register", 
                                                  :account_update => "account-settings" }

2 个答案:

答案 0 :(得分:1)

由于你的评论嵌套在hacks中,你需要评论和黑客。所以,试试这个

<强> show.html.slim

= render partial: "comments/form", locals: { new_comment: @new_comment, hack: @hack } if user_signed_in?

<强> _form.html.slim

= simple_form_for [hack, new_comment], :remote => true do |f|

答案 1 :(得分:0)

<强>路线

首先,我认为您的表单不会路由到index操作

comments_path的调用取决于您在路线中定义的CRUD操作。具体来说,form_for将自动填充create操作,Rails将尝试从您在resource文件中定义的基于routes.rb的路由集调用:

enter image description here

请注意上面的示例,如何使用/photos动词转到POST?这可能看起来像 发送到“索引”动作(photos_path) - 但实际上,凭借HTTP动词,它将转到create动作


<强>表格

simple_form_for基本上是form_for的抽象:

  

在刚刚显示的示例中,虽然未明确指出,但我们   仍然需要使用:url选项以指定表单的位置   将要发送。但是,如果可以进一步简化   传递给form_for的记录是一种资源,即它对应于a   一组RESTful路由,例如使用资源方法定义   配置/ routes.rb中。在这种情况下,Rails将简单地推断出合适的   记录本身的URL

基本上,form_for尝试构建要从其拥有的对象提交的url。您有一个嵌套路由,这意味着您需要提供嵌套对象:

= simple_form_for [hack, new_comment], :remote => true do |f|

这应该将路径发送到hacks_comments_path,这是你想要的,对吧?或者,您可以规定url选项:

= simple_form_for new_comment, remote: true, url: hacks_comments_path(hack) do |f|

请注意这两个修补程序如何需要hack局部变量?

= render partial: "comments/form", locals: { new_comment: @new_comment, hack: @hack } if user_signed_in?

<强>修正

您需要将nested路径传递给simple_form_for帮助者(如上所述)