如何通过rails中的IF语句运行数组?

时间:2010-05-24 21:56:11

标签: ruby-on-rails ruby

我正在创建一个应用程序,根据用户是否已经“担保”来突出显示来自流的用户消息。如果它是为单个作者设置的,它可以正常工作。例如

controller: @vouch = Vouch.last.vouched_user_nickname

view:

 <% Twitter::Search.new(params[:id]).each do |tweet| %>
   <li>
     <%= image_tag tweet.profile_image_url %> 

<% if @vouch.include? tweet.from_user %> <div class="flit_message_containerh">

            <u> <a href="http://twitter.com/<%= tweet.from_user %>"> <%= tweet.from_user %></a></u> <%= linkup_mentions(auto_link(h tweet.text)) %>
            <div class="time_ago">
          <%= link_to distance_of_time_in_words_to_now(tweet.created_at) , tweet %>
       <% else %>    <div class="flit_message_container">
    <u> <a href="http://twitter.com/<%= tweet.from_user %>"> <%= tweet.from_user %></a></u>
           <%= linkup_mentions(auto_link(h tweet.text)) %>
                <div class="time_ago">
              <%= link_to distance_of_time_in_words_to_now(tweet.created_at) , tweet %>
            <% end %>

但是我在为多个用户昵称做这件事时遇到了麻烦。

@vouch =  Vouch.find(:all,
      :select => "vouched_user_nickname", 
      :group => 'vouched_user_nickname'                  

)

任何想法都将不胜感激。我是铁杆菜鸟。

5 个答案:

答案 0 :(得分:3)

假设你的Vouch模型与Twitter源之间没有关系(我还没有使用过那个gem /插件,所以我不知道),一个解决方案就是拉出所有的Twitter条目你想要和控制器中的所有凭证,并在视图中进行检查。

控制器:
@tweets = Twitter::Search.new(params[:id])
@vouches = Vouch.find(:all)

视图:

<% @tweets.each do |tweet| %>
  <div class="flit_message_container<%=
    @vouches.any? { |v| v.vouched_user_nickname == tweet.from_user } ? "h" : ""
  %>">
    ...
  </div>
<% end %>

答案 1 :(得分:0)

@vouch =  Vouch.find_by_vouched_user_nickname(:all, ["nickname1","nickname2"])

答案 2 :(得分:0)

您的问题是您不知道要编写的正确控制器代码以找到 @vouch 数组吗?或者,一旦你得到它,你不知道如何处理数组?

 view: <% if @vouch.include? tweet.from_user %> 

.INCLUDE?如果tweet.from_user有一个对象也包含在@vouch数组中以获取控制器中的@vouch数组,则可以调用单个对象或对象数组的方法:

答案 3 :(得分:0)

您的问题似乎是您没有循环遍历数组,那么它如何决定某些元素是否符合您设置的标准?

示例,在您的视图中:

<% for vouch in @vouch do %>
  <% if vouch.include? tweet.from_user %>
    <div class="flit_message_containerh">
      <u><a href="http://twitter.com/<%= tweet.from_user %>"> <%= tweet.from_user %></a></u> <%= linkup_mentions(auto_link(h tweet.text)) %>
            <div class="time_ago">
          <%= link_to distance_of_time_in_words_to_now(tweet.created_at) , tweet %>
       <% else %>    <div class="flit_message_container">
    <u> <a href="http://twitter.com/<%= tweet.from_user %>"> <%= tweet.from_user %></a></u>
           <%= linkup_mentions(auto_link(h tweet.text)) %>
                <div class="time_ago">
              <%= link_to distance_of_time_in_words_to_now(tweet.created_at) , tweet %>
  <% end %>
<% end %>

答案 4 :(得分:0)

我看到了几个问题。 第一个是:

@vouch = Vouch.last.vouched_user_nickname

您正在使用名为@vouch的变量来存储用户昵称。这是违反直觉的,会让其他人阅读你的代码(比如我自己)。请改用这样的东西:

@vouch = Vouch.last #on the controller
@vouch.vouched_used_nickname #on the view

这......当你试图做“多重”的例子时,“异国情调”的命名惯例会让你自己感到困惑:

@vouch =  Vouch.find(:all,
      :select => "vouched_user_nickname", 
      :group => 'vouched_user_nickname')

Activerecord的find(:all,...)将总是返回一个activerecord对象数组(或一个空数组)。你似乎期待一个字符串数组。如果你做Vouch.find,你将永远获得Vouches。

:选择部分只是限制了这些凭证的信息量(它们只附带了vouched_user_nickname。其余的,包括它们的id,是空的,因为它不是从数据库中读取的。)

如果你想拥有一系列用户昵称,你可以这样做:

# note the names. @vouchers in plural, and @nicknames for the user names
@vouchers =  Vouch.find(:all, :select => "vouched_user_nickname",
  :group => 'vouched_user_nickname')
@nicknames = @vouchers.collect{|v| v.vouched_user_nickname}