2

私のアプリには、リストとカテゴリの b/w 関係があります。カテゴリ インデックス ページから、ユーザー フィルター選択ボックスを使用して、ショー ページのリストを表示できるようになりました。

カテゴリ表示ページのリストに添付された画像にアクセスできなくなりました。

list.rb

attr_accessible :placeholder, :categories_ids

  has_and_belongs_to_many :categories
  has_attached_file :placeholder, :styles => { :medium => "300x300>", :thumb => "100x100>" }, :default_url => "/images/:style/missing.png",
                      :url => "/system/:hash.:extension",
                     :hash_secret => "longSecretString"

カテゴリ コントローラ

def index
  @categories = Category.all
end

def show
  @categories = Category.find_by_sql ["select distinct l.* from listings l , categories c, categories_listings cl where c.id = cl.category_id and l.id = cl.listing_id and c.id in (?,?)" ,  params[:c][:id1] , params[:c][:id2]]
end

SQLは、リストをフィルタリングして表示ページに表示するだけで、その属性を表示できますが、プレースホルダーにアクセスできません。show の複数の @categories に注意してください

カテゴリーショーページ

<ul>
  <% @categories.each_with_index do |c, index| %>
  <% if  index == 0 %>
    <li class="first"><%= c.place %></li>

    <%= image_tag c.placeholder.url(:thumb) %>

    <li><%= c.price %></li>

    <% else %>
    <li><%= c.place %></li>
    <li><%= c.price %></li>

    <%= image_tag c.placeholder.url(:thumb) %>
    <% end %>

  <% end %>
</ul>

レール上のペーパークリップ宝石ルビーを使用して、ビュー内の別のビューから画像にアクセスします

これは、オブジェクトを複数形にしてループを呼び出すと言われています。 wch は画像にアクセスできるようにします。

この場合は機能しません。

undefined method `placeholder' for #<Category:0x5c78640>

しかし驚くべきことは、そのスタックオーバーフローで提案されているように使用すると、プレースホルダーがすべてのリストのすべての画像の配列として表示されることです.wchは明らかに、私が好む方法ではありません. 問題はどこですか?私は何が欠けていますか?

4

1 に答える 1

0

あなたのコードを見て、すぐにわかる問題は、それがモデルplaceholderの一部であり、listing.rbcategory.rb


ActiveRecord オブジェクト

ActiveRecord オブジェクト (例: @categories = Category.all) を呼び出すと、モデル上に ActiveRecord オブジェクトが作成されますCategory。これは、その依存関係に配列のようにアクセスする必要があることを意味します ->@categories.listings

これらのレコードの関連付けはhas_and_belongs_to_many、モデルで作成したさまざまな関連付けで作成され、正しく機能しているようです

したがって、次のように、リストをカテゴリの依存関係として呼び出すことをお勧めします。

<%= image_tag c.listings.first.placeholder.url(:thumb) %>

アップデート

リストのすべての画像を表示するには、次の.eachようにループするだけです。

<ul>
  <% @categories.each_with_index do |c, index| %>
  <% if  index == 0 %>
        <li class="first"><%= c.place %></li>

        <% c.listings.each do |listing| %>
            <%= image_tag listing.placeholder.url(:thumb) %> 
        <% end %>

        <li><%= c.price %></li>
    <% else %>
        <li><%= c.place %></li>
        <li><%= c.price %></li>

        <% c.listings.each do |listing| %>
            <%= image_tag listing.placeholder.url(:thumb) %> 
        <% end %>

    <% end %>

  <% end %>
</ul>

アクティブレコード & ペーパークリップ

結論はこうだと思います。

あなたの SQL クエリは、リスティング データベースから「純粋なデータ」を取り戻しています。それは問題ありませんが、Paperclip の.url関数を使用する必要があります。この関数は、 ActiveRecord(画像オブジェクトを作成し、ActiveRecord オブジェクトにアタッチします)でのみ起動します。

リスティング データベースには次の列があります。

  • placeholder_file_name
  • placeholder_content_type
  • placeholder_file_size
  • placeholder_updated_at

画像ファイルは別のパスに保存されているため、これらは画像出力を作成できません。placeholder_file_name

Paperclip を使用すると、これらの列に格納されたデータが取得され、ActiveRecord イメージ オブジェクトが作成されます。このオブジェクトは、 を使用して呼び出すことができますc.listings.first.placeholder.urlplaceholder列がデータベースにまったく含まれていないことに注意してください。ActiveRecordつまり、その機能を使用する前に、Paperclip を呼び出す必要があります。

次のようなクエリを使用できます(正直に言うと、これは暗闇の中での完全な刺し傷ですが、より多くの洞察が得られることを願っています)。

@categories = Category.joins(:listings).where(:id => [params[:c][:id1],params[:c][:id2]])
于 2013-11-03T15:14:33.027 に答える