2017-11-12 4 views
0

기본 검색을 구현했으며 각 결과를 이미지와 정렬하여 표시하고 싶습니다. 내 응용 프로그램에서 carrierwave gem을 사용 중이며 첨부 파일을 통해 루프를 시도하여 처음 것만 축소판으로 표시합니다.레일이 첨부 파일을 루프하고 첫 번째를 표시합니다.

<div class="container"> 
    <div class="img-thumbnail" style="display: inline-block;"> 
    <% if @items.present? %> 
     <% @items.each do |item| %> 
     <% item.attachments.each do |attachment| %> 
      <%= image_tag attachment.url(:mini).first unless attachment.blank? %> 
      <% end %> 
     <% end %> 
    <% end %> 
</div> 

create_table "items", force: :cascade do |t| 
    t.string "title" 
    t.string "description" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.json "attachments" 
end 

하지만 불행히도 이미지가 표시되지 않으며 오류가 없으면 빈 축소판 만 표시됩니다. 어떤 아이디어를 구현하는 방법?

+0

'paperclip' 또는 다른 보석을 사용하고 있습니까? 당신이 있다면, 질문에 그것을 지정하고 태그에 넣어주십시오. 또한 항목 모델 정의 (첨부 파일과 관련된 부분)를 표시 할 수 있습니까? –

+0

@ André Guimarães Sakata의 답장을 보내 주셔서 감사합니다. 내 질문에 대한 추가 정보가 있습니다. – Theopap

+1

저는 carrierwave에 익숙하지 않지만, 처음에는 홍당무가 아니라 첨부 파일을 반복 할 필요가 없습니다. 왜 라인 5-8은'item.attachments.find (& : present?) &. url (: mini)'와 같은 것이 아닌가? – moveson

답변

1

답변에서 attachments을 반복하고 반복에 색인을 추가하십시오. 그러나 반복의 유일한 목적은 색인 == 0 인 첨부를 선택하는 것입니다. 동일한 것을 표현하는 훨씬 쉬운 방법은 attachments[0]을 사용하여 직접 색인 0에서 첨부 파일을 검색하는 것입니다. Ruby-idiomatic이라면 attachments.first을 사용할 수 있습니다.

그래서 우리는 내부 반복을 완전히 제거 할 수 있습니다. @items이 있는지 확인한 다음 items 번을 반복하고 각 URL의 첫 번째 첨부 파일을 선택하고 URL을 검색하면됩니다.

여기 단순화 된 버전입니다 :이 실패 할

<% if @items.present? %> 
    <% @items.each do |item|%> 
     <%= image_tag item.attachments.first.url(:mini) %> 
    <% end %> 
<% end %> 

주 (코드 너무) 모든 항목이 첨부 파일이없는 경우. Ruby의 안전 탐색 연산자 (Ruby 2.3 이상에서 작동)를 사용하여이를 방지 할 수 있습니다. 세 번째 줄을 다음으로 바꿀 수 있습니다 :

  <%= image_tag item.attachments.first&.url(:mini) %> 
# This prevents error if `.first` return nil^
+0

@moveson의 머리를 주셔서 감사합니다! 귀하의 솔루션도 효과가 있습니다! – Theopap

관련 문제