0

フォーム フィールドの値を取得して、それをクリップの添付ファイル名として使用することはできますか?

PiecePhotoモデル:

belongs_to :piece

has_attached_file :image,
    :styles => {
        :slider => "940x420#",
        :single => "540>",
        :thumb => "60x60#",
        :medium => "140x140#",
        :original => "1024x1024>"
    }, 
    :path => ":attachment/:id/:style/:filename",
    :url => ":attachment/:id/:style/:filename",
    :storage => :s3,
    :bucket => 'monavala',
    :s3_credentials =>"#{Rails.root}/config/s3.yml"

validates_presence_of :image
before_post_process :parameterize_file_name

def parameterize_file_name
    extension = File.extname(image_file_name).gsub(/^\.+/, '')
    filename = File.basename(image_file_name, ".#{extension}").parameterize
    self.image.instance_write(:file_name, "#{filename}.#{extension}")
end

フォームフィールドから値を取得するのではfilename = File.basename(image_file_name, ".#{extension}").parameterizeなく、image_file_name

編集:

モデルがネストされています

Piece
    has_many :piece_photos
    accepts_nested_attributes_for :piece_photos

PiecePhotos
    belongs_to :piece
    has_attached_file :image

モデル内のフォーム値を取得すると MVC パターンが壊れることを理解しています。別の方法はありますか?

編集2:

ここでは厳密にしようとしましたが、もう少し説明する必要があると思います。

フォームはネストされています。私はCollectionそのフォームを持って:has_many Pieces:has_many PiecePhotosます。

フィールドは、追加できるPieces各フィールドに追加PieceできPiecePhotosます。

そのファイル名をname + 一意の文字列または IDPiecePhotosと同じにしたいと思います。Piece

したがって、すべてを 1 つの投稿で行う必要があります。最初にピースの写真をアップロードして、後でピースに追加したくありません。

基本的に必要なのは、Piece 名を取得し、それを PiecePhoto ファイル名として使用することだけです。

これは現在のフォームのイメージです。まだ開発中です。

フォーム フィールド

4

2 に答える 2

2

これは古い質問であることは知っていますが、今週同じ問題が発生し、最終的に機能するようになったので、他の誰かが同じ問題に遭遇した場合に備えて答えると思いました.

基本的に、Paperclip には補間 ( paperclip/interpolations )を介して動的パスを使用する機能があります。これを行うには、モデルの上部に補間コードを追加するだけです

ワンピース写真モデル:

Paperclip.interpolates :fixed_file_name do |attachment, style|
 attachment.instance.fixed_file_name
end

:fixed_file_nameこれで、URL の末尾に追加したり、呼び出したいものを何でも追加したりできます。を必ず追加してください。そうし:extensionないと、ファイルは追加されずに保存されます。アップロードされるファイルと同じ拡張子が自動的に使用されるため、問題はありません。

:path => ":attachment/:id/:style/:fixed_file_name.:extension",
:url => ":attachment/:id/:style/:fixed_file_name.extension",

あとは、それを定義するだけです。rails .parameterize を使用することもできます。#{image_file_name}フィールド名を配置するだけで、 .parameterize.

def fixed_file_name
 return "#{image_file_name.parameterize}"
end

Rails 4.2 を使用しているので、これをテストしたのは Rails 4.2 のみであることは認めますが、多くのフラストレーションの後に動作させることができました。

于 2015-08-14T19:59:08.267 に答える
0

モデルで使用できますparams[:paramHere]が、ベスト プラクティスとは見なされないため、使用する場合は、最初にコピーを作成して、何も変更しないようにしてください。

params_copy = params.dup

....
filename = params[:attachment_name]

編集:

より良い代替手段は、ファイル名コードを次のPiecePhotoController ようなものに移動することです:

def create
  @piece_photo = PiecePhotos.new
  @piece_photo.file_attachment_name = params[:file_attachment_name]

  unless @piece_photo.save do
    #error-handling
  end
end

または、既存のレコードの を変更する場合は、コードを他のメソッドに入れることがfile_attachment_nameできるので、メソッドを呼び出すことができますchange_attachment_filename


編集2:

しかし、ペーパークリップは非常に単純なので、これで十分なはずなので、前の代替手段も必要ありません。

これはあなたのフォームです (明らかに、さらにいくつかのフィールドがあるかもしれません):

<% form_for :piece_photo, :html => { :multipart => true } do |f| %>
  <%= f.file_field :photo %>
<% end %>

@piece_photoあとは、次の方法でレコードを作成するだけで、次の@piece_photo = PiecePhotos.create(params[:piece_photo])ように表示できます。

<%= image_tag @piece_photo.photo.url %>

また

<%= image_tag @piece_photo.photo.url(:thumb) %>

このブログ投稿または公式のペーパークリップ github readmeをご覧ください。

于 2012-10-23T20:12:53.523 に答える