Ruby on rails 4 为什么在select_标记:onchange事件上调用this.form.submit()时为其他控制器调用错误路由
我设置了一个名为“dir\u list”的select\u标记,以使用表单submit on change调用一个方法。此方法“file_dir”将根据从dir_list中选择的内容生成文件列表,并渲染部分以显示第二个显示文件列表的列表框 当我点击选择框“dir_list”中的一个选项时,会调用表单submit,但我得到一个路由错误。rails后端代码正在为同一项目中的不同控制器生成路由 它应该调用的路由是:“/file\u alias\u filedata/file\u dir”,而不是调用路由:“file\u alias\u filedata/file\u alias\u tfiles/file\u dir” 当我处理问题时,我有一个单独的控制器、视图和路由,名为“file\u alias\u tfiles”,它有类似的代码和我的file\u alias\u filedata,用于在同一UI功能中解决不同的问题。这两个集合是完全独立的,我在我的file\u alias\u filedata代码中彻底检查了对tfiles的任何调用,但没有 为什么会发生这种情况?我如何清除它 有没有办法对我的表单标签和this.form.submit调用进行硬编码,这样就不会出现错误解释 以下是从我将选择更改为路由错误时日志文件中的内容:Ruby on rails 4 为什么在select_标记:onchange事件上调用this.form.submit()时为其他控制器调用错误路由,ruby-on-rails-4,routes,form-submit,selectionchanged,Ruby On Rails 4,Routes,Form Submit,Selectionchanged,我设置了一个名为“dir\u list”的select\u标记,以使用表单submit on change调用一个方法。此方法“file_dir”将根据从dir_list中选择的内容生成文件列表,并渲染部分以显示第二个显示文件列表的列表框 当我点击选择框“dir_list”中的一个选项时,会调用表单submit,但我得到一个路由错误。rails后端代码正在为同一项目中的不同控制器生成路由 它应该调用的路由是:“/file\u alias\u filedata/file\u dir”,而不是调用路
Started POST "/file_alias_filedata/evaluate_media" for 10.25.241.142 at 2014-10-14 19:44:23 +0000
Processing by FileAliasFiledataController#evaluate_media as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"LmBkjhXsw19VzCVV0S7yZvX5aJ8KAcX9R8eSyYiN3aY=", "location"=>"miniprod", "dir_list"=>"/watchfolder/miniprod/inprocess", "filepath"=>"/watchfolder/showtimevod/BeautyShop_125727.mpg", "filepath2"=>"/watchfolder/showtimevod/BeautyShop_125727.mpg"}
^[[1m^[[35mFileAliasFiledata Load (0.8ms)^[[0m SELECT `file_alias_filedata`.* FROM `file_alias_filedata` WHERE `file_alias_filedata`.`full_path` = '/watchfolder/showtimevod/BeautyShop_125727.mpg' AND `file_alias_filedata`.`deleted_b` = 0 ORDER BY `file_alias_filedata`.`id` ASC LIMIT 1
Rendered file_alias_filedata/_dir_list.html.erb (1.4ms)
Rendered file_alias_filedata/_dir_list.html.erb (1.0ms)
Rendered file_alias_filedata/_list_files.html.erb (11.3ms)
Rendered file_alias_filedata/_dir_list.html.erb (1.1ms)
Rendered file_alias_filedata/_dir_list.html.erb (2.0ms)
Rendered file_alias_filedata/_dir_list.html.erb (1.1ms)
Rendered file_alias_filedata/_dir_list.html.erb (0.6ms)
Rendered file_alias_filedata/_dir_list.html.erb (0.3ms)
Rendered file_alias_filedata/index.html.erb within layouts/application (100.3ms)
Completed 200 OK in 3562ms (Views: 1040.0ms | ActiveRecord: 4.5ms)
Started GET "/file_alias_filedata/file_alias_tfiles/file_dir?dir_list=%2Fwatchfolder%2Fminiprod%2Finprocess" for 10.25.241.142 at 2014-10-14 19:44:27 +0000
ActionController::RoutingError (No route matches [GET] "/file_alias_filedata/file_alias_tfiles/file_dir"):
actionpack (4.1.4) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
actionpack (4.1.4) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
railties (4.1.4) lib/rails/rack/logger.rb:38:in `call_app'
railties (4.1.4) lib/rails/rack/logger.rb:20:in `block in call'
activesupport (4.1.4) lib/active_support/tagged_logging.rb:68:in `block in tagged'
activesupport (4.1.4) lib/active_support/tagged_logging.rb:26:in `tagged'
activesupport (4.1.4) lib/active_support/tagged_logging.rb:68:in `tagged'
railties (4.1.4) lib/rails/rack/logger.rb:20:in `call'
actionpack (4.1.4) lib/action_dispatch/middleware/request_id.rb:21:in `call'
rack (1.5.2) lib/rack/methodoverride.rb:21:in `call'
rack (1.5.2) lib/rack/runtime.rb:17:in `call'
下面是我正在调用的控制器方法:(我可以在url中调用它,它将显示默认列表文件。)
以下是上面文件\u dir代码的控制器名称:
class FileAliasFiledataController < ApplicationController
以下是索引文件中的form_标记设置,它围绕为部分渲染设置的选定目录列表div:
<%= form_tag(:url => '/file_alias_filedata/file_dir', :method => :get, :id => 'dir_select_tag2') do %>
<div id="dir_list">
<%= render :partial => 'dir_list', :locals => {:dir_choice => @radio_button_value } %>
</div><br />
'/file\u alias\u filedata/file\u dir',:method=>:get,:id=>'dir\u select\u tag2')do%>
'dir_list',:locals=>{:dir_choice=>@radio_button_value}%>
我还使用form_标记尝试了这种格式,得到了相同的结果:
<%= form_tag({:controller => 'file_alias_filedata', :action => 'file_dir', :method => :get}, {:id => 'dir_select_tag'}) do %>
'file\u alias\u filedata',:action=>'file\u dir',:method=>:get},{:id=>'dir\u select\u tag'})do%>
下面是_dir_list部分代码,其中包含select_标记:onchange=>this.form.submit()
选择目录路径:
“this.form.submit();”,:with=>“'dir_list='+this.options[this.selectedIndex]。值”%>
我怎样才能让这个呼叫正确的路线?有人能解释为什么会发生这种情况吗?在此代码中:
<%= form_tag(:url => '/file_alias_filedata/file_dir',
:method => :get,
:id => 'dir_select_tag2') do %>
<% if dir_choice== "miniprod" %>
<% @dir_list = Dir["/watchfolder/miniprod/*"] %>
<% elsif dir_choice== "watch" %>
<% @dir_list = Dir["/watchfolder/*"].reject{ |f| f[%r{^/watchfolder/miniprod}] || f[%r{^/watchfolder/aspera_console}]} %>
<% elsif dir_choice== "archive" %>
<% @dir_list = Dir["/archive/*"] %>
<% elsif dir_choice== 'local'%>
<% @dir_list = Dir["/home/silver/test/*"] %>
<% else %>
<% @dir_list = ["/watchfolder/aspera_console/"] %>
<% end %>
请注意,form_tag()将两个哈希作为前两个参数。在代码中,您向form_tag()传递了一个散列,因此该散列被分配给第一个参数变量,即url_for_options。该变量被传递给名为url_for()的方法。文档对于url_for()来说非常混乱,但底线是url_for()不理解哈希中的任何键。这些键应该位于分配给第二个参数变量的散列中,即选项
您可以用两种不同的方式重写表单_tag():
<%= form_tag( '/file_alias_filedata/file_dir',
:method => :get,
:id => 'dir_select_tag2') do %>
…将两个散列作为参数传递
rails后端代码正在为不同的应用程序生成路由
同一项目中的控制器。
有人能解释为什么会这样吗
文档的ActionController::Base#url_表示:
生成新URL时,可能会从
当前请求的参数。例如,url_For:action=>
“某些操作”将保留当前控制器
因为传递给url_for()的哈希没有:控制器键:
<%= form_tag(:url => '/file_alias_filedata/file_dir',
:method => :get,
:id => 'dir_select_tag2') do %>
…与生成html无关,因此它应该位于控制器中
在这方面,
select_tag 'dir_list', options_for_select(@dir_list, @selected_dir_list)
@所选目录列表未定义
然后选择这个select_tag()选项:
将在
上创建如下所示的html属性:
form_tag(url_for_options = {}, options = {}, &block)
<select with="'dir_list='+this.options[this.selectedIndex].value" ...>
这是一个毫无意义的属性。你能不能把你读到的rails方法贴出来,它采用了:with选项?谷歌说没有,但根据你的帖子,我知道至少有一个
你的变量/控制器/动作名称通常都很糟糕。您给表单提供了一个id“select_tag”,这毫无意义。“表格为目录选择”或“目录表格”如何?如果您不需要代码方面的帮助,您可以随意命名变量。如果您需要帮助,并且您的变量名不清楚,那么没有人会费心阅读您的代码(我想您已经发现了)
最后,当你发布文件时,你需要发布文件的完整路径名,而不仅仅是说“这是控制器”。嗨,卡罗尔,你似乎已经收到了下面一个非常全面的答案,但是你似乎没有接受它,没有投票,也没有回复它,尽管它发布后已经登录。在这件事上这不是很有帮助吗?
<%= form_tag(:url => '/file_alias_filedata/file_dir',
:method => :get,
:id => 'dir_select_tag2') do %>
<% if dir_choice== "miniprod" %>
<% @dir_list = Dir["/watchfolder/miniprod/*"] %>
<% elsif dir_choice== "watch" %>
<% @dir_list = Dir["/watchfolder/*"].reject{ |f| f[%r{^/watchfolder/miniprod}] || f[%r{^/watchfolder/aspera_console}]} %>
<% elsif dir_choice== "archive" %>
<% @dir_list = Dir["/archive/*"] %>
<% elsif dir_choice== 'local'%>
<% @dir_list = Dir["/home/silver/test/*"] %>
<% else %>
<% @dir_list = ["/watchfolder/aspera_console/"] %>
<% end %>
select_tag 'dir_list', options_for_select(@dir_list, @selected_dir_list)
:with => "'dir_list='+this.options[this.selectedIndex].value"
<select with="'dir_list='+this.options[this.selectedIndex].value" ...>