0

これは、ユーザーが表示されるはずのユーザー表示ビューです。..

<section>
  <div id= "purchases">
    <%= render 'shared/micropost_form_purchase' %>
  </div>
  <div id="sales">
    <%= render 'shared/micropost_form_sale' %>
  </div>
</section>

<%= @sales %>  <%# This is just to see if it outputs anything. It doesn't :( %>
<div id="purchases list">
  <ol class="microposts">
    <%= render @purchases unless @purchases.nil? %>
  </ol>
</div>

<div id="sales list">
  <ol class="microposts">
    <%= render @sales unless @sales.nil? %>
  </ol>
</div>

そのため、フォーム (部分) は正常に読み込まれますが、投稿を行うと、いずれかで購入リストも販売リストも表示されません。データベースを確認したところ、種類 (販売または購入) を示す列のエントリと共に作成されています。

フォームは次のとおりです。

<%= form_for (@micropost) do |f| %>

  <div class="field no-indent">
    <%= f.text_area :content, placeholder: "What's something else you want to buy?" %>
    <%= hidden_field_tag 'micropost[kind]', "purchase" %>
  </div>
  <%= f.submit "Post", class: "btn btn-large btn-primary" %>
<% end %>

<%= form_for (@micropost) do |f| %>

  <div class="field no-indent">
    <%= f.text_area :content, placeholder: "What's something else you want to buy?" %>
    <%= hidden_field_tag 'micropost[kind]', "sale" %>
  </div>
  <%= f.submit "Post", class: "btn btn-large btn-primary" %>
<% end %>

また、ここに users_controller.rb の show 部分があります

 def show
    @user = User.find(params[:id])
    @micropost=Micropost.new
    @microposts = @user.microposts.paginate(page: params[:page])
  end

これが microposts_controller.rb の show 部分です

def show

    @micropost = Micropost.find(params[:id])
    @microposts = Micropost.where(:user_id => @user.id)
    @purchases= @microposts.collect{ |m| m if m.kind == "purchase"}.compact
    @sales = @microposts.collect{ |m| m if m.kind == "sale"}.compact

  end

さらに、この投稿 (http://stackoverflow.com/questions/12505845/ruby-error-wrong-number-of-arguments-0-for-1#12505865) の助けを借りて、変数 @microposts、@purchases、および@sales はすべてコンソールに正しく出力されています。

誰でも私を助けることができますか?

編集:与えられた回答で示唆されているようにスコープを使用すると、コンソールで機能します(すべてを正しく出力しますが、ビューには表示されません。これは、ユーザーの表示ページの構文に問題があることを意味しますか?

編集2:

これがview/microposts/_micropost.html.erbコードです

<li>
  <span class="content"><%= micropost.content %></span>
  <span class="timestamp">
    Posted <%= time_ago_in_words(micropost.created_at) %> ago.
  </span>
  <% if current_user?(micropost.user) %>
    <%= link_to "delete", micropost, method:  :delete,
                                     confirm: "You sure?",
                                     title:   micropost.content %>
  <% end %>
</li>
4

2 に答える 2

1

私はあなたのコードをもっと見ることなくいくつかの仮定をしていますが、あなたが示したものを少し違った方法で書くことができるようです. データベースが移行中で、必要な列 (Micropost#kind、Micropost#user_id など) があると想定しています。スコープを使用して、マイクロポストのコレクションをより表現力豊かに絞り込むことができます。ActiveRecord スコープについて読むと役立つかもしれません: http://guides.rubyonrails.org/active_record_querying.html#scopes

class Micropost < ActiveRecord::Base
  belongs_to :user

  scope :purchases, where(:kind => "purchase")
  scope :sales, where(:kind => "sale")

  # your code
end

また、ユーザーが多くのマイクロポストを持っていると仮定しています:

class User < ActiveRecord::Base
  has_many :microposts

  # your code
end

あなたのフォームでは、非表示フィールドをフォーム オブジェクト (f.hidden_​​field) に添付して、名前を「micropost[kind]」と指定する必要がないようにすることをお勧めします。

<%= form_for(@micropost) do |f| %>
  <div class="field no-indent">
    <%= f.text_area :content, placeholder: "What's something else you want to buy?" %>
    <%= f.hidden_field :kind, :value => "sale" %>
  </div>
  <%= f.submit "Post", class: "btn btn-large btn-primary" %>
<% end %>

MicropostsController#show では、新しいスコープを使用できます。

def show
  @micropost = Micropost.find(params[:id])
  @microposts = @user.microposts
  @purchases = @microposts.purchases
  @sales = @microposts.sales
end

また、MicropostsController#create アクションが実際にフォームを送信するユーザーにマイクロポストを追加していることも確認する必要があります (現在のユーザー メソッドを想定しています)。

def create
  @micropost = current_user.microposts.create(params[:micropost])
  # yada
end

次のコマンドを使用して、購入または販売のマイクロポストを作成した後、Rails コンソールで期待される結果を確認することもできます。

Micropost.purchases
Micropost.sales

繰り返しになりますが、コード ベースを詳しく見ていないと、何かを見落としている可能性があります。

于 2012-09-20T22:13:15.873 に答える
0

Micropost.count, @purchases.count, @sales.count(コントローラまたはビューの一部に出力することにより) をチェックして、レコードが実際に存在するかどうかを確認します。

@salesまた、や などのコレクションをレンダリングする場合@purchasesは、モデルのパーシャルが存在することを確認する必要があり_micropost.html.erbます (この場合)。これはおそらく、ビュー エラーを探す必要がある場所です。ご存じのとおり、そのファイルは空である可能性があるため、エラーはまったく表示されません。

問題は microposts#create (またはマイクロポストを保存するアクション) にもある可能性があります。マイクロポストは current_user に関連付ける必要があります。

@micropost = current_user.microposts.build(params[:micropost])

これと以前の質問を考慮して、分解する前に RoR チュートリアルの元のコードをもう一度確認することをお勧めします (すべてのテストがパスしていることを確認します)。実験のためにいつでも新しいテストを追加することができ、どこが間違っていたのかを理解するのに役立ちます。

于 2012-09-21T04:09:41.193 に答える