Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 4 为什么在select_标记:onchange事件上调用this.form.submit()时为其他控制器调用错误路由_Ruby On Rails 4_Routes_Form Submit_Selectionchanged - Fatal编程技术网

Ruby on rails 4 为什么在select_标记:onchange事件上调用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”,而不是调用路

我设置了一个名为“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调用进行硬编码,这样就不会出现错误解释

以下是从我将选择更改为路由错误时日志文件中的内容:

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"  ...>