0

我是 RoR 的新手,并试图设置一个列出 Windows Azure 帐户上所有容器/文件的应用程序。使用waz-storage gem,我可以找到容器和其中的 blob,但我遇到的问题是尝试通过其中一个元数据属性对返回的容器列表进行排序,并根据它们进行过滤用户电子邮件。

使用container.list我得到每个容器的列表,如下所示:

[#<WAZ::Blobs::Container:0x60295f8 @name="12345">, #<WAZ::Blobs::Container:0x60295b0 @name="23456">, #<WAZ::Blobs::Container:0x6029580 @name="34567">]

每个容器都有自己的元数据,我可以通过调用@container.metadata

{:transfer_encoding=>"chunked", :last_modified=>"Thu, 13 Dec 2012 06:01:23 GMT", :etag=>"\"0x8CFA70E6A590AD9\"", :server=>"Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0", :x_ms_request_id=>"a2cbc9ba-9e59-4c27-8a50-c54b405cbb1b", :x_ms_version=>"2011-08-18", :x_ms_meta_customername=>"Sample Name", :x_ms_meta_useremail=>"user@example.com", :date=>"Thu, 13 Dec 2012 16:29:16 GMT"} 

在视图中,我想列出每个容器并使用:x_ms_meta_customername属性链接到它。我已经在视图中达到了这一点:

<% @containerlist.each do |container| %>
    <li><%= link_to container.metadata[:x_ms_meta_customername], root_url(:container => container.name) %></li>
<% end %>

视图中的链接按照上面列表中的值的顺序创建,container.name即“12345”、“23456”和“34567”。相反,我希望列表按:x_ms_meta_customername.

我尝试了一些不同的方法来对列表进行排序,但最终要么不对其进行排序,要么在将字符串转换为整数时出错。我可能会把这一切都错了。

我想做的另一件事是根据:x_ms_meta_useremail属性过滤列表。几乎所有用户都会始终显示整个列表,但有些用户只能访问元数据中包含其电子邮件的容器。

我做了一些搜索,似乎找不到任何有帮助的东西。我有点走到了死胡同。

我想知道的另一件事是,我应该在视图中完成所有这些工作吗?或者将此逻辑移至模型或控制器?

任何帮助将不胜感激!

4

1 回答 1

1

您可以使用sort对记录进行排序。

@containerlist.sort {|a, b| a.metadata[:x_ms_meta_useremail] <=> b.metadata[:x_ms_meta_useremail]}

或者更简单:

@containerlist.sort_by {|c| c.metadata[:x_ms_meta_useremail]}

要过滤,您可以使用reject!.

@containerlist.reject! {|c| c.metadata[:x_ms_meta_useremail] != @user.email}

作为一般的经验法则,您应该尝试将逻辑排除在您的视图之外。你还想让你的控制器尽可能的瘦。如果我这样做,我将创建一个可以从控制器调用的服务类。

于 2012-12-13T16:58:37.387 回答