Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.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 在Rails中向Haml文件传递多个变量?_Ruby On Rails_Haml - Fatal编程技术网

Ruby on rails 在Rails中向Haml文件传递多个变量?

Ruby on rails 在Rails中向Haml文件传递多个变量?,ruby-on-rails,haml,Ruby On Rails,Haml,我试图让rails将目录的内容推送到Haml(作为字符串数组),并将它们呈现为链接,其文件名作为链接文本,但却不知道如何将多个实例变量传递到Haml文件。 这是我的控制器代码: class FilesController < ApplicationController def index @dir = Dir.new('/Users/userName/Code/RailsTest/public/'); @files = Dir::entries('/Us

我试图让rails将目录的内容推送到Haml(作为字符串数组),并将它们呈现为链接,其文件名作为链接文本,但却不知道如何将多个实例变量传递到Haml文件。 这是我的控制器代码:

    class FilesController < ApplicationController
    def index
     @dir = Dir.new('/Users/userName/Code/RailsTest/public/');
     @files = Dir::entries('/Users/userName/Code/RailsTest/public/');
     @fileNames = @files;
     for file in @files
       file = @dir.path + '/' + file
     end
     respond_to do |format|
        format.html # index.html.haml
        #format.xml  { render :locals {:files => @files, :fileNames: @fileNames} }
        format.xml  { render :xml => @files }
     end
  end
end
谢谢你能给予的任何帮助

编辑: 我的控制器方法现在包含

@dir = Dir.new('/Users/chronon/DEsktop/RailsNexus/public');
     @files = Dir::entries('/Users/chronon/DEsktop/RailsNexus/public');
     @fileNames = @files;
     @files.map! do |file|
       {:path => "#{@dir.path}/#{file}", :filename => file}
     end
     respond_to do |format|
        format.htm
     end
index.html.haml和_file_link.html.haml都是nzifnab建议的。 但是,我现在在我的链接文件中遇到“无法将符号转换为整数”错误

两个haml文件的内容都是

%h1 Files
%p This will eventually list the files in our upload directory

= render :partial => 'files/file_link', :collection => @files, :as => :file

= link_to(:file[:path], :file[:filename])

(我必须将“file”更改为:file,渲染才能正常工作。基于这些越轨指南)

您认为这是您想要的吗

   @myfiles = [];
     for file in @files
           @myfiles << { :file => @dir.path + '/' + file, :filename => file}
     end

     respond_to do |format|
       format.html
     end
@myfiles=[];
对于@files中的文件
@myfiles@dir.path+'/'+file,:filename=>file}
结束
回应待办事项|格式|
format.html
结束

有两种方法可以做到这一点:将其呈现为部分,或呈现为普通输出模板。如果将其呈现为部分,则可以传递一个:locals选项哈希,用于获取变量。如果呈现普通haml文件,则需要对数据使用实例变量

我会将控制器中的for循环更改为:

@files.map! do |file|
  {:path => "#{@dir.path}/#{file}", :filename => file}
end
编辑:刚刚意识到您可能不习惯.map!方法。它将遍历@files中的每个条目一次,并将其值更改为块中最后一行的值。如果您使用.map而不是.map!则该方法将返回一个由这些值组成的新数组

这只是有点像ruby,我不能100%确定你使用的for循环是否像你所希望的那样通过引用来改变值。同样,也许你的方法很好……但我喜欢类似ruby的方法,比如Array.map、Array.each等,而不是for语法,这样你就可以在一个好的散列中获得每个对象所需的所有数据

您的haml文件可以更改如下:

index.html.haml

%h1 Files
%p Something exciting

= render :partial => 'files/file_link', :collection => @files, :as => :file
= link_to(file[:path], file[:filename])
这将为
@files
数组中找到的每个对象呈现一次文件
files/file_link.html.haml
,并按照
:as=>
选项的指定将该对象保存在局部变量
file

然后您可以拥有此文件:

\u file\u link.html.haml

%h1 Files
%p Something exciting

= render :partial => 'files/file_link', :collection => @files, :as => :file
= link_to(file[:path], file[:filename])
您在控制器中定义的任何实例变量都将在视图中自动可用。如果出于任何原因,您希望将视图中的对象改为局部变量,我相信您将不得不将视图渲染为局部视图而不是完整视图。尽管这样做可能可行,但我不能100%确定:

format.html{ render :action => 'index', :locals => {:files => files} }
然而,这并不是一个很好的实践。通常只在视图中直接使用控制器中的实例变量。希望我在这里的某个地方回答了您的问题:)(您没有选项或参数的
format.html
对于我上面发布的视图代码就足够了)

编辑:

您正确地将
呈现:partial更改为,:as=>:file
(这里的符号,我在上面进行了更新)。但是,它所做的是将
@files
数组中的每个项作为名为
file
的新局部变量发送到partial。因此,您的partial仍然应该说:

= link_to(file[:path], file[:filename])
还请记住,您不再需要
@fileNames
实例变量。
.map!
和哈希为您解决了这个问题

为了澄清,在调用
@files.map!do
…等之后,您的数据结构应该如下所示:

@files = [
  {:path => "my/path/1/filenamex", :filename => "filenamex"},
  {:path => "my/path/2/filenamey", :filename => "filenamey"},
  {:path => "my/path/3/filenamez", :filename => "filenamez"}
]
因此,当您将变量发送到
render:partial=>
时,它将为每个散列渲染一次。第一次渲染时,它会将_file\u link.html.haml中的
文件
变量设置为:

{:path => "my/path/1/filenamex", :filename => "filenamex"}
对于每个散列值,它将进行三次检查


我希望您能理解发生了什么:)

除了“未定义的局部变量或方法`file'之外,它还能工作“我的index.html.haml文件出错。我用更好的描述更新了上面的问题。谢谢你@Tim我编辑了我的答案以反映您自己的编辑。让我知道这是否有帮助,或者你是否需要一些澄清。你最好能理解为什么有些东西在工作,而不仅仅是复制粘贴代码,然后说“耶,我完成了”这样的话,我相信我知道我之前出错的原因和地方了。谢谢