0

私のRails 3.0.3アプリケーションには、ユーザーが「保存先」を使用して画像をダウンロードできるリンクがある「月」という足場があります。ここで、月モデルが属している場所と壁紙モデルを関連付ける必要があります。

ルート:

  root :to => 'inicio#index'

  resources :wallpapers do
    resources :months
  end

  # the route that works with no association
  # match 'download/:id' =>  'months#download', :as => :download

  # the route I tried
  match 'wallpapers/:id/months/:id' =>  'months#download', :as => :download

月モデル:

class Month < ActiveRecord::Base
  belongs_to :wallpaper

  has_attached_file :wallpaper_picture, :styles => {
    :default => { :geometry => '530x330', :quality => 80, :format => 'jpg'}
  }
end

フレンドリーIDの壁紙モデル:

class Wallpaper < ActiveRecord::Base  
  has_many :months, :dependent => :destroy

  extend FriendlyId
  friendly_id :title, :use => :slugged
end

months_controller でダウンロード メソッドを作成しました。このメソッドは関連付けなしで機能します。

class MonthsController < InheritedResources::Base
  belongs_to :wallpaper, :finder => :find_by_slug!

  def download
    @wallpaper = Wallpaper.find(params[:wallpaper_id])
    @month = @wallpaper.month.find(params[:id])

    send_file @month.wallpaper_picture.path,
              :filename => @month.wallpaper_picture_file_name,
              :type => @month.wallpaper_picture_content_type,
              :disposition => 'attachment'
  end
end

月/インデックスを表示

- @months.each do |month|  
  = link_to image_tag(month.wallpaper_picture(:default)), wallpaper_month_path(month.wallpaper, month)

months_controller でダウンロード方法を変更しようとしましたが、間違っています:

@months = Wallpaper.month.conditions({:person_id => some_id})
4

1 に答える 1

0

これが私がそれを手に入れた方法
です

resources :wallpapers do  
  resources :months  
end  
match 'wallpaper/:wallpaper_id/download/:id' => 'months#download', :as => :download

ルートでは、:wallpaper_id (has_many :months) を渡す必要があります。
:id は現在のコントローラーの ID です (belongs_to :wallpaper)
'download' はビューで使用されるパスの名前になります 'download_path'
このパスでは外部キーとIDを渡す必要があります

月/インデックスを表示

- @months.each do |month|     
  = link_to 'Download Picture', download_path(month.wallpaper_id, month.id) 

months_controller では、download メソッドがこれらのパラメーターを受け取り、関連する画像を send_file メソッドに渡します。

def download
  @wallpaper = Wallpaper.find(params[:wallpaper_id])
  @month = @wallpaper.months.find(params[:id])

  send_file @month.wallpaper_picture.path,
              :filename => @month.wallpaper_picture_file_name,
              :type => @month.wallpaper_picture_content_type,
              :disposition => 'attachment'
end

PD: 本番環境で send_file が失敗した場合は、send_data に変更するか
、config/production.rb でこの行をコメントアウトします。

config.action_dispatch.x_sendfile_header = "X-Sendfile"  

send_file は空のファイルを送信するだけです

于 2012-12-28T03:49:45.597 に答える