Как запустить массив через оператор IF в рельсах? - PullRequest
1 голос
/ 25 мая 2010

Я создаю приложение, которое выделяет пользовательские сообщения из потока в зависимости от того, был ли пользователь «проверен» Он отлично работает, если он настроен для одного автора. Например

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 ]

3 голосов
/ 25 мая 2010

Предполагая, что нет никакой связи между вашей Vouch моделью и источником Twitter (я еще не использовал этот гем / плагин, так что я не знаю), одно решение - извлечь все записи 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 %>
0 голосов
/ 25 мая 2010

Я вижу несколько проблем. Первый такой:

@vouch = Vouch.last.vouched_user_nickname

Вы используете переменную с именем @vouch для хранения псевдонима пользователя. Это противоречит здравому смыслу и сбивает с толку других людей, читающих ваш код (таких как я). Вместо этого используйте что-то вроде этого:

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

Это ... eum ... "экзотическое" соглашение об именах помогает запутать себя, когда вы пытаетесь сделать "множественный" пример:

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

Функция findrecord (: all, ...) всегда возвращает массив объектов activerecord (или пустой массив). Вы, кажется, ожидаете массив строк. Вы всегда получите ваучеры, если сделаете Vouch.find.

Часть: select только ограничивает объем информации, которую имеют эти ваучеры (они приходят только с заполненным именем vouched_user_nickname. Остальная часть, включая их идентификатор, пуста, поскольку не считывается из базы данных).

Если вы хотите иметь массив псевдонимов пользователей, вы можете сделать это следующим образом:

# 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}
0 голосов
/ 25 мая 2010

Ваша проблема в том, что вы не знаете правильный код контроллера, который нужно написать для поиска массива @ vouch ? Или вы не знаете, что делать с массивом после его получения?

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

.include? это метод, который вы можете вызвать как для одного объекта, так и для массива объектов, если tweet.from_user имеет объект, который также включен в массив @vouch для получения массива @vouch в вашем контроллере, который вы должны:

0 голосов
/ 25 мая 2010

Кажется, ваша проблема в том, что вы не просматриваете массив, так как он может определить, соответствуют ли определенные элементы заданным вами критериям?

Пример, на ваш взгляд:

<% 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 %>
0 голосов
/ 25 мая 2010
@vouch =  Vouch.find_by_vouched_user_nickname(:all, ["nickname1","nickname2"])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...