【问题标题】:Need help passing dynamic list of files to partial. Can't get list to pass successfully in Rails需要帮助将文件的动态列表传递给部分。无法在 Rails 中成功通过列表
【发布时间】:2016-02-07 16:38:35
【问题描述】:

在我的应用程序/索引中,用户从下拉列表中选择位置和目录路径。 onchange 事件调用名为 file_dir 的控制器,它获取路径,执行命令行调用,将该目录中的文件列表传递回参数@files。然后我渲染一个将这个@files 传递给局部变量的部分。然后在部分选择标签将显示传递给它的文件列表。

我是 ROR 新手,无法成功传递可读的局部变量。到局部。使用硬编码的行,一切都可以正常工作,但不能使用局部变量。

有人可以帮忙告诉我正确的设置方法吗?

这是从接收目录的第一个 onchange 下拉传递调用的方法:

 def file_dir
    unless params[:dir_list].nil?
      @dir_path_choice = params[:dir_list]
    else  
      @dir_path_choice = '/watchfolder/indemandvod'
    end  
#   @files = "#{@dir}"    
    @files = Dir.glob("#{@dir_path_choice}/**/*.{mpg,mov}").map
    if @files.nil?
      @files = Dir.glob("/watchfolder/hbovod/**/*.{mpg,mov}").map
    end
    render :partial => 'list_files', :locals => { @list => @files }
  end 

在 irb 中,我测试了 @files = Dir.glob("#{@dir_path_choice}/**/*.{mpg,mov}").map 行,以确保处理正确。这是@files 的样子:

1.9.3-p547 :008 > @files
 => #<Enumerator: ["/watchfolder/indemandvod/MJR-TEST.mov", "/watchfolder/indemandvod/MJR-TEST-AWS1.mov", "/watchfolder/indemandvod/MJR-TEST-AWS.mov", "/watchfolder/indemandvod/MJR-TEST2.mov", "/watchfolder/indemandvod/PIX_Gor_SVO40185/PIX_Gor_SVO40185_mezz.mov"]:map>

此数据在选择列表中出现,用逗号分隔。

注意:我确实尝试在不带 @ 符号的情况下传递 @list,但我得到了无法识别的局部变量或方法,并且在不添加 @ 的情况下无法运行代码。这就像一个数据集合,所以我希望它将它解释为一个数组。不过不确定。

这里是部分文件代码:

  <p>          
        <label>Select Partial Test File List:</label><%= @list %><br />
        <% unless @list.nil? %>
            <%= @list %>
        <% else %>
          <label> list is empty. </label>
          <% @list = Dir.glob("/watchfolder/showtimevod/**/*.{mpg,mov}").map %>
        <% end %>
        <%= select_tag 'filepath', options_for_select(@list, @selected_filepath) %> 
  </p>

它确实显示在页面上,并且始终显示我的“列表为空”,并且下拉框填充了“/watchfolder/showtimevod/”文件列表的默认“硬编码”命令行。

@selected_filepath 维护列表中的选定行。

我不知道在将值传递给部分时我做错了什么。

【问题讨论】:

  • 当您从控制器中的@list 中删除@ 时,您是否也从部分中的所有@list 引用中删除了它?你只给了我们部分的错误信息,所以很不清楚。

标签: ruby-on-rails-4 drop-down-menu partials local-variables


【解决方案1】:

在我的应用程序/索引中,

什么是“应用程序/索引”?

有人可以帮忙告诉我正确的设置方法吗?

正确的方法是先做一些简单的事情:

app/controllers/some_controller.rb

  def file_dir
    puts "****#{params[:dir_list]}"
    @files = %w[ a b c]

    render :partial => 'list_files', :locals => { file_names => @files }
  end 

views/some_controller/_list_files.htm.erb:

<div>

<%= file_names.each do |fname| %>
<div><%= fname %></div>
<% end %>

</div>

和你所有的帖子一样,在这一行:

<%= select_tag(
       'filepath', 
       options_for_select(@list, @selected_filepath) %> 

@selected_filepath 未定义。

这就像一个数据集合,所以我希望它将它解释为 数组。不过不确定。

您可能应该努力创建您理解的数据。你想用这行来完成什么:

@files = Dir.glob("#{@dir_path_choice}/**/*.{mpg,mov}").map

以下行不行:

@files = Dir.glob("#{@dir_path_choice}/**/*.{mpg,mov}")

这个:

我确实尝试在没有@符号的情况下传递@list,但我得到了 未识别的局部变量或方法,无法运行代码 不添加@。

是不够的。没有人关心你对错误消息的解释是什么——人们关心的是确切的错误消息,包括文件名和行号,复制并粘贴到你的帖子中,以及错误所指的确切代码。

如果你只是想让你的代码工作,你可以这样做:

app/some_controller.rb:

  def file_dir
    if params[:dir_list].nil?
      @dir_path_choice = '/watchfolder/indemandvod'
    else  
      @dir_path_choice = params[:dir_list]
    end 

    @files = Dir.glob("#{@dir_path_choice}/**/*.{mpg,mov}").map

    if @files.nil?
      @files = Dir.glob("/watchfolder/hbovod/**/*.{mpg,mov}").map
    end

    render :partial => 'list_files', :locals => {file_names => @files }
  end 

但是,将 map() 添加到 Dir.glob() 的末尾没有任何用处。

app/views/some_controller/_list_files.html.erb:

<p>          
  <label>Select Partial Test File List:</label>
  <%= select_tag 'filepath', options_for_select(file_names) %> 
</p>

【讨论】:

    猜你喜欢
    • 2020-06-08
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 2022-12-09
    • 2021-03-19
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    相关资源
    最近更新 更多