无法在rails 4嵌入式ruby中正确插值我的动态代码

时间:2014-10-08 19:15:52

标签: ruby-on-rails-4 erb string-interpolation

我从下拉框中传递一个选定的目录,并将目录路径传递给部分中的第二个下拉框,我计划对此值进行插值并正确运行Dir.glob命令,然后显示可用文件。目录已选中。

我无法使插值正常工作。一种方法是使用#{}和变量。这种风格在我的控制器中工作,但是我无法将值数组传递给我的部分(新到rails并且还在学习所有你可以做的事情)。

我在我的部分尝试了erb,我认为可能有效,但是我收到错误并且列表没有显示:无法将nil转换为字符串,而且它是在表单帖子后页上对选择框值的解释。 'evaluate_media将'index'呈现为post。

以下是ERB的部分内容:

 require 'erb'
  <p>          
        <label>Select Partial Test File:</label><br />
        <label>Dir Partial Selected Path Choice: </label><%= dir_path_choice %><br />
        <%= dir_path_choice = params[:dir_list] %>
        <label>Partial Path Choice: </label><%= @dir_path_choice %><br />
        <% if dir_path_choice %>
            <% @dir = 'Dir.glob("' << @dir_path_choice << '/**/*.{mpg,mov}").map' %>
        <% else %>
        <% dir = 'Dir.glob('"/watchfolder/miniprod/hot/**/*.{mpg,mov}"').map' %>
        <% end %>   
        <label>Partial Dir: </label><%= @dir %><br />
        <% template = ERB.new dir %>
        <% @files = template.result %>
        <%= select_tag 'filepath', options_for_select(@files, @selected_filepath) %> 
</p>

这是有效的字符串赋值,但是是硬编码的:

<% @files = Dir.glob("/watchfolder/showtimevod/**/*.{mpg,mov}").map %>
<%= select_tag 'filepath', options_for_select(@files, @selected_filepath) %> 

以下是与硬代码一起使用的完整部分,并且在显示中显示两个值在其值中是正确的: @dir_path_choice(包含传递的目录路径。 @dir(是要执行的完整Dir.glob字符串。)

  <p>          
        <label>Select Partial Test File:</label><br />
        <label>Dir Partial Selected Path Choice: </label><%= dir_path_choice %><br />
        <%= @dir_path_choice = params[:dir_list] %>
        <label>Partial Path Choice: </label><%= @dir_path_choice %><br />
        <% if @dir_path_choice %>
            <% @dir = 'Dir.glob("' << @dir_path_choice << '/**/*.{mpg,mov}").map' %>
        <% else %>
        <% @dir = 'Dir.glob('"/watchfolder/miniprod/hot/**/*.{mpg,mov}"').map' %>
        <% end %>   
        <label>Partial Dir: </label><%= @dir %><br />
        <% @files = Dir.glob("/watchfolder/showtimevod/**/*.{mpg,mov}").map %>
        <%= select_tag 'filepath', options_for_select(@files, @selected_filepath) %> 
  </p>

这是控制器使用值:

重新显示部分
 def file_dir
    @dir_path_choice = params[:dir_list]
#   @files = "#{@dir}"    
#    @files = "Dir.glob(#{@dir_path_choice}/**/*.{mpg,mov}).map"   
#    render :partial => 'list_files', :collection => @files, :as :item 
    render :partial => 'list_files', :locals => {:dir_path_choice => @dir_path_choice }
  end   
end 

1 个答案:

答案 0 :(得分:0)

require 'erb'

您不需要在视图或部分中使用erb。 erb是rails的默认模板语言。

在你的部分内容中,你试图访问params hash:

<%= dir_path_choice = params[:dir_list] %>

我不知道你能做到这一点,但是当我尝试它时,我能够部分地访问params哈希。我不知道为什么这对你不起作用,但在任何情况下都不是好的做法。

将以下行添加到views / layouts / application.html.erb文件中会很有帮助:

<%= debug(params) if Rails.env.development? %>

这样每个页面都会显示params哈希中的内容。你可以把它放在关闭的body标签之前。如果需要,可以使用此css设置调试输出的样式:

.debug_dump {  //rails automatically wraps the debug info in a <pre> tag with class="debug_dump"
  clear: both;
  float: left;
  width: 100%;
  margin-top: 45px;

  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
  box-sizing: border-box;
}

...您可以将其放入assets / stylesheets / custom.css中。

然后加载给您带来麻烦的页面并查看调试信息以查看dir_list是否有值。

如果params [:dir_list]有值,那么你可以尝试以下几点:

  1. 您可以尝试直接在部分中访问@dir_path_choice。也不被认为是良好做法。
  2. 因为您执行了此操作::locals => {:dir_path_choice => @dir_path_choice},部分名为dir_path_choice的部分应该有一个局部变量,其中包含您想要的内容。
  3. 如果params [:dir_list]没有值,那么您提交行动的任何表格都会出现问题。

    此外,这个红宝石代码都没有:

        <%= dir_path_choice = params[:dir_list] %>
        <label>Partial Path Choice: </label><%= @dir_path_choice %><br />
        <% if dir_path_choice %>
            <% @dir = 'Dir.glob("' << @dir_path_choice << '/**/*.{mpg,mov}").map' %>
        <% else %>
        <% dir = 'Dir.glob('"/watchfolder/miniprod/hot/**/*.{mpg,mov}"').map' %>
        <% end %>   
        <label>Partial Dir: </label><%= @dir %><br />
        <% template = ERB.new dir %>
        <% @files = template.result %>
    

    ...与生成html有关,因此它不应该在视图中 - 它应该在控制器中。此外,当你这样做时:

    template = ERB.new dir
    

    ERB.new()的参数必须是包含erb的字符串,例如

    "<div><%= greeting %></div>"
    

    然后你可以这样做:

    require 'erb'
    
    str = "<div><%= greeting %></div>"
    greeting = "hello world"
    
    my_erb = ERB.new(str)
    puts my_erb.result  #=><div>hello world</div>
    

    但你为什么要这样做呢?

    你的dir变量,如上所述,需要是erb代码,在这里设置:

    dir = 'Dir.glob('"/watchfolder/miniprod/hot/**/*.{mpg,mov}"').map
    

    然而,这条线路没有任何问题。事实上,我甚至都不知道那是什么。如果我尝试匹配报价,我会得到:

    dir = 'Dir.glob('    "/watchfolder/miniprod/hot/**/*.{mpg,mov}"   ').map
    

    前两个单引号创建一个字符串;接下来的两个双引号会创建另一个String,然后是什么:').map?即使您将所有引号都匹配起来,String也不会有map()方法。你应该在那一行得到1000个错误。

    最后,当您发布错误消息时,您对错误消息的解释是无关紧要的:人们需要看到的是复制和粘贴的EXACT错误消息,包含行号和文件名。 Rails错误消息很长,所以你可以从前15行开始,它应该像这样引用:

      

    用户/ 7stud / rails_projects / sample_app2 /应用/控制器/ static_pages_controller.rb:3:   未终止的字符串符合文件末尾   /Users/7stud/rails_projects/sample_app2/app/controllers/static_pages_controller.rb:3:   语法错误,意外的输入结束,期待keyword_end