没有路由匹配[GET]" / update_states"

时间:2014-09-16 14:41:47

标签: ruby-on-rails ajax

我正在使用this指南创建简单的动态选择。

我最终完成了一半,但是当我从下拉列表中选择区域时,它不会显示任何子记录。就我而言,是国家。

我使用Firebug检查错误我在选择区域后立即出现theese错误。它说

No route matches [GET] "/update_states"

但我仔细检查了我的routes.rb文件,就像这样:

get 'home/update_states', as: 'update_states'
get 'home/show'

所以我想知道这个错误会是什么?

Home_controller.rb

class HomeController < ApplicationController
 def index
   @form = Form.new
    @regions = Region.all
    @states = State.where("region_id = ?", @regions.first.id)
  end

  def show
    @state = State.where("id = ?", params[:form][:state_id])
  end

  def update_states
    @states = State.where("region_id = ?", params[:region_id])
    respond_to do |format|
      format.js
    end
  end
end

提前致谢。

4 个答案:

答案 0 :(得分:1)

上面的代码没有正确引用控制器#动作。就这样,

get 'home/update_states' => 'home#update_states', as: 'update_states'
get 'home/show' => 'home#show'

答案 1 :(得分:1)

我认为最好的方法是:

 match '/update_states' => 'home#update_states', :as => 'update_states'
 match '/show', to: 'home#show', via: 'get'

答案 2 :(得分:1)

您需要映射路线以包含控制器和操作。

get 'home/update_states' => 'home#update_states', as: 'update_states'
get 'home/show' => 'home#show'

此映射要求您拥有HomeController两种方法(操作)update_statesshow

第二个问题是你在Get上进行了/update_states,但是你还没有映射它!

尝试改为点击/home/update_states路线。

要检查所有可用的路由和映射,请在控制台中使用rake routes

编辑:

好的,所以查看您的HomeController,您的update_states操作会查找region_id匹配params[:region_id]的状态。但这并没有被传递到任何地方!

执行此操作的一种方法是将路线更改为:

get 'home/:region_id/update_states' => 'home#update_states', as: 'update_states'

然后这将改变路线

GET /home/12/update_states

这将查找region_id=12的状态。

请注意,这只是传递参数的一种方式,您需要确保路由模式不会发生冲突。

答案 3 :(得分:0)

我建议学习资源丰富的路线是值得的。如果你想让你的路线达到最高水平(没有/ home在前面),你可以做这样的事情。

  scope '/', controller: :home do
    get :update_states
    get :show
  end 

这个DRYer会自动生成url helper(不是:必需),并且很清楚你正在使用哪个控制器和动作。