2010-05-24 42 views
1

我正在創建一個應用程序,根據用戶是否被「保證」來突出顯示來自流的用戶消息。如果它爲單個作者設置,它工作正常。例如如何通過導軌中的IF語句運行數組?

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'     

) 

任何想法將不勝感激。我是一個鐵軌小菜。

回答

3

假如沒有你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

耶。那工作。真正優雅和創意的解決方案謝謝。 – user250181 2010-05-24 23:35:56

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

我試過,但它不工作。我需要改變視圖嗎?謝謝。 – user250181 2010-05-24 22:02:43

+0

還有其他建議嗎?我以幾種方式嘗試了這一點,但這不起作用。 – user250181 2010-05-24 22:52:08

+0

現在你需要做一些與@vouch不同的東西(也許可以重新命名爲憑證),因爲它是一個數組,如視圖中的'@vouches.each do | vouch | ...'。 – BaroqueBobcat 2010-05-24 23:08:58

0

是你的問題,你不知道正確的控制器代碼編寫找到@vouch陣列?或者一旦你得到它,你不知道該如何處理數組?

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

.include?是一種可以調用單個對象或對象數組的方法,如果tweet.from_user有一個對象也包含在@vouch陣列中以在您的控制器中獲得@vouch陣列,您應該:

+0

我是一個noob,所以爲了簡單起見,這兩個問題都有關係。 – user250181 2010-05-24 22:05:22

+0

嗯,實際上,我認爲我的問題是我不知道如何處理視圖中的數組。它似乎在抓住正確的數據。 – user250181 2010-05-24 22:07:07

+0

更新了一些視圖代碼。 – Schneems 2010-05-24 22:11:41

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 %> 
+0

這將重複數據庫中每個證實的每條推文。絕對不想要。 – Samuel 2010-05-24 23:25:37

+0

是的,確認。那就是這樣做的。 – user250181 2010-05-24 23:26:54

0

我看到幾個問題。 第一個是這樣的:

@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') 

的ActiveRecord的find( :all,...)將總是返回一個activerecord對象(或一個空數組)的數組。你似乎期待着一串字符串。如果您使用Vouch.find,您將獲得Vouches。

:select部分只是限制這些憑證的信息量(它們只與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}