Нужна помощь в передаче динамического списка файлов в частичный. Не удается получить список для успешного прохождения в Rails

В моем приложении/индексе пользователь выбирает местоположение и путь к каталогу из раскрывающегося списка. Событие onchange вызывает контроллер с именем file_dir, где он берет путь, выполняет вызов командной строки, возвращая список файлов в этом каталоге в параметр @files. Затем я частично передаю эти @files в локальную переменную. Затем в партиале тег select будет отображаться со списком переданных ему файлов.

Я новичок в 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 поддерживает выбранную строку в списке.

Я не знаю, что я делаю неправильно при передаче значений частичным.


person Carol Brown    schedule 11.10.2014    source источник
comment
Когда вы удалили @ из @list в контроллере, вы также удалили его из всех ссылок @list в партиале? Вы предоставили нам только часть сообщения об ошибке, так что оно очень неясно.   -  person Chris Peters    schedule 11.10.2014


Ответы (1)


В моем приложении/индексе

Что такое «приложение/индекс»?

Может кто-нибудь, пожалуйста, помогите мне посоветовать правильный способ настроить это?

Правильный способ - сначала заставить работать что-то простое:

приложение/контроллеры/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 без символа @, но получил неопознанную локальную переменную или метод и не смог запустить код без добавления @.

недостаточно. Никого не волнует, какова ваша интерпретация сообщения об ошибке — людям важно ТОЧНОЕ сообщение об ошибке с именами файлов и номерами строк, скопированное и вставленное в ваш пост, вместе с точным кодом, к которому относится ошибка.

Если вы просто хотите, чтобы ваш код работал, вы можете сделать это:

приложение/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>
person 7stud    schedule 17.10.2014