2016-04-15 3 views
0

なぜ私のルビーは.eachの列挙型は、オブジェクトの配列が空の場合は空のdivを生成していますか、またはオブジェクトが1つある場合は空のdivを追加しています。@posts変数。ここで空のdivは、HTML.erbページのルービー.each列挙型で表示されます。

は私のindex.html.erbページです:

<div id="post_feed"> 
<%if @posts.any?%> 
    <%@posts.each do |p|%> 
    <div class="post_text_box"> 
     <%=p.body%> 
    </div> 
    <%end%> 
<%end%> 
</div> 

ポストコントローラー:

def index 
    @posts = current_user.posts 
    @new_post = current_user.posts.new 
    end 

CSS:

#post_feed{ 
    margin-right:auto; 
    margin-left:auto; 
    width:400px; 
} 

.post_text_box{ 
    padding:10px; 
    margin:10px; 
    background-color:#FFFFFF; 
} 

レールコンソールが1つのアイテムを示します。それはまだ保存されていないにもかかわらず

irb(main):014:0> Post.count 
    (1.3ms) SELECT COUNT(*) FROM "posts" 
=> 1 

Here is an image of the empty div.

答えて

0

、Railsは@new_postcurrent_user.postsの一部であることを検討しているので、あなたの@postsリストの最後に空白のポストを持っています。

保存されていないため、データベースクエリで表示されません。

あなたが何をする必要があるかに応じて、@new_postは空の投稿(@new_post = Post.new)にして、保存時にそのユーザーを割り当てることができます。

それとも、あなたが望む結果を与えることがそのチェックに頼ることができれば、あなたはポストはdivを作成する前に、身体を持っているかどうかを確認することができ、あなたのeachループ内:

<div id="post_feed"> 
    <%@posts.each do |p|%> 
    <% if p.body %> 
     <div class="post_text_box"> 
     <%=p.body%> 
     </div> 
    <%end%> 
    <%end%> 
</div> 

あなたがドン」新しい投稿が@new_post = current_user.posts.newで作成されたため、常にtrueと評価されるので、if @posts.any?チェックが必要です。

一般に、rubyではeachループが実行される前に配列が空であるかどうかをチェックする必要はありません。なぜなら、eachループは空の配列で何もしない(またはエラーを投げない)からです。

+0

ありがとう、Joseph。あなたのやり方は、私が作った混乱よりもずっときれいです。 – user1730335

0

私はそれを理解しました。私のコントローラでは、私は新しいオブジェクトを作成していますが、保存しません。私の各イテレータは、@ postsオブジェクト配列内のオブジェクトとして保存されていなくても、それをオブジェクトとして認識しています。

new_recordを使用してレコードが新しいかどうかチェックしましたか?メソッド。

<div id="post_feed"> 
<%if @posts.any?%> 
    <%@posts.each do |p|%> 
    <%if ! p.new_record?%> 
    <div class="post_text_box"> 
     <%=p.body%> 
    </div> 
    <%end%> 
    <%end%> 
<%end%> 
</div>