我有一个Rails应用程序,用户可以从索引页面中选择数据表( cosmics )。 我在该页面上有一个按钮,该按钮连接到自定义路线 start_batch 。路线出现在rake:routes上,尽管没有GET或PUT。
当按下它时,我想在另外两个表中创建行:批次和 batch_details 。
相反,当我按下按钮时,Rails正试图转到 cosmics 控制器的show动作。
耙:路由
start_batch /cosmics/start_batch(.:format) cosmics#start_batch
cosmics_controller
def start_batch
@batch = Batch.create!(:status => 'created',:status_timestamp => Time.now)
@cosmics.where(:selected == true) do |cosmic|
@batch_detail = BatchDetail.create!(:batch_id => @batch.id, :gene => @cosmic.gene, :mut_freq => @cosmic.mut_freq)
@batch_detail.save
end
end
的routes.rb
resources :batches do
resources :batch_details
end
resources :cosmics
match '/cosmics/start_batch', :to => 'cosmics#start_batch', :as => 'start_batch'
cosmics / index.html.erb
<%= link_to 'Process', start_batch_path, :class =>"btn btn-primary" %>
我有一个我看不到的错误,或者我完全错误地做了这个错误吗?
答案 0 :(得分:2)
您必须将start_batch
路线放在resources :cosmics
match '/cosmics/start_batch', :to => 'cosmics#start_batch', :as => 'start_batch'**
resources :cosmics
Rails使用与routes.rb
中请求的网址匹配的第一条路线。第resources :cosmics
行生成get /cosmics/:id
到CosmicsController.show
的路线。此路由在自定义路由匹配'/ cosmics / start_batch'之前捕获/cosmics/start_batch
请求,这就是它必须放在之后的原因。
您可以看到resources :cosmics
与rake routes
生成的路由(路由按优先级排序)。 Rails routing guide中还有一个例子。
答案 1 :(得分:2)
问题是您的match
路线低于resources :cosmics
。顺序在这里很重要,因为正在发生的事情是它在资源"start_match"
上的显示路线上匹配时将cosmics
解释为ID。如果你将其移到resources :comics
以上,你应该没问题。