我正在使用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
提前致谢。
答案 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_states
和show
。
第二个问题是你在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(不是:必需),并且很清楚你正在使用哪个控制器和动作。