【问题标题】:Where is undefined method called?未定义的方法在哪里调用?
【发布时间】:2015-11-18 13:05:31
【问题描述】:

我有一个decisions 资源,它嵌套在groups 资源下。 has_manybelongs_to 已在模型中定义。

resources :groups do
  resources :decisions
end

...我在这个路径上有一个编辑表单:

/groups/:group_id/decisions/:id/edit(.:format)

我的 Rspec 测试出现错误:

失败/错误:put :update, {:id => decision.to_param, :decision => valid_attributes,group_id:decision.group.id},valid_session 无方法错误: #DecisionsController:0x007ffeb23482e0>

的未定义方法“decision_url”

当我在开发环境中导航到表单时,我收到了类似的错误:

<%= link_to 'Edit', edit_group_decision_path(@group, @decision) %>

/groups/6/decisions/5/edit 处的 NoMethodError

#

的未定义方法 `decision_path'

我正在使用'better_errors' gem,它引用了form_for 的第一行来表示无方法错误:

<%= form_for(@decision) do |f| %>

我的代码中没有'decision_url'。我错过了什么? form_for 不应该知道将更新放在哪里吗?它的有效路径位于:

/groups/:group_id/decisions/:id(.:format)

这是日志中看起来最令人兴奋的部分:

Rendered decisions/_form.html.erb (6.5ms)
  Rendered decisions/edit.html.erb within layouts/application (7.1ms)
Completed 500 Internal Server Error in 9ms (ActiveRecord: 0.1ms)

NoMethodError - undefined method `decision_path' for #<#<Class:0x007fd5d98527b0>:0x007fd5d400d618>:
  actionpack (4.2.3) lib/action_dispatch/routing/polymorphic_routes.rb:220:in `polymorphic_method'
  actionpack (4.2.3) lib/action_dispatch/routing/polymorphic_routes.rb:134:in `polymorphic_path'
  actionview (4.2.3) lib/action_view/helpers/form_helper.rb:466:in `apply_form_for_options!'
  actionview (4.2.3) lib/action_view/helpers/form_helper.rb:434:in `form_for'

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 better-errors-gem


    【解决方案1】:

    您已像这样指定嵌套资源:

    resource groups do
      resource decisions
    end
    

    但是,应该使用符号指定路由,如下所示:

    resource :groups do
      resource :decisions
    end
    

    确保您的模型也定义了正确的关系:

    class Group < ActiveRecord::Base
      has_many :decisions
    end
    
    class Decision < ActiveRecord::Base
      belongs_to :group
    end
    

    【讨论】:

    • 我很抱歉错字。资源是/是我的代码中的符号。根据您的回答定义了这些关系。谢谢!
    【解决方案2】:

    这是它抱怨的 decision_url 电话:

    if @decision.update(decision_params)
            format.html { redirect_to @decision), notice: 'Decision was successfully updated.' }
    

    @decision 更改为group_decision_path(@group, @decision) 修复了它。

    【讨论】: