2012-10-23 2 views
0

양식 필드 값을 가져 와서 종이 클립 첨부 파일 이름으로 사용할 수 있습니까?종이 클립 파일 이름으로 사용할 양식 값 가져 오기

PiecePhoto 모델 : filename = File.basename(image_file_name, ".#{extension}").parameterize에서

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 

내가 대신 image_file_name의 원하는 양식 필드의 값을 얻을 수 있습니다.

편집 :

모델이

Piece 
    has_many :piece_photos 
    accepts_nested_attributes_for :piece_photos 

PiecePhotos 
    belongs_to :piece 
    has_attached_file :image 

내가 모델의 내부 형태의 값을 점점 MVC 패턴을 나누기 이해 중첩됩니다. 다른 방법이 있습니까?

Edit2가 :

여기 엄격하려고하지만 난 좀 더 설명해야합니다 생각합니다.

폼 나는 Collection 양식을 가지고, 중첩 :has_manyPieces:has_manyPiecePhotos 그.

Pieces에 필드를 추가 할 수 있으며 각각 Piece에 대해 PiecePhotos을 추가 할 수 있습니다.

PiecePhotos의 파일 이름을 Piece 이름과 일부 고유 한 문자열 또는 ID로 같게하고 싶습니다.

모든 게시물을 하나의 게시물에서 처리해야합니다. 조각 사진을 먼저 업로드하고 나중에 조각에 추가하고 싶지 않습니다.

기본적으로 피스 이름을 가져 와서 PiecePhoto 파일 이름으로 사용해야합니다.

여기에 양식이 어떻게 보이는지 이미지가 있습니다. 아직 개발 중입니다. 당신은 아무것도 변경하지 않도록

Form Fields

답변

0

당신이 그것을 사용 할 때, 첫 번째 복사본을 생성, 당신은 당신의 모델에서 params[:paramHere]을 사용할 수 있지만 가장 좋은 방법을 고려 아니에요.

params_copy = params.dup 

.... 
filename = params[:attachment_name] 

편집 :

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

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

또는 일부에 코드를 넣을 수 있습니다 : 더 나은 대안은 같은과 PiecePhotoController 에 파일 이름 코드를 이동하는 것

기존 레코드에서 file_attachment_name을 변경하는 경우 다른 방법을 사용할 수 있으므로 충족시킬 수 있습니다. hod는 change_attachment_filename 또는 무엇인가 불렀다.


Edit2가 :

그러나 클립이 충분해야한다는 너무 간단하기 때문에 심지어 이전 대안이 필요하지 않아야 :

이 당신의 형태는 (분명히 몇 가지가있을 수 있습니다 더 많은 필드) :

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

이제을 통해 @piece_photo 레코드를 생성해야합니다. 21,그리고 당신과 같이 표시 할 수 있습니다 :

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

또는

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

blog post 또는 공식 paperclip github readme에서보세요.

+0

'정의되지 않은 지역 변수 또는 메소드'params '가 나타납니다. 해당 모델이 중첩되어 있다고 언급하지 않았습니다. – babalooi

+0

대안으로 내 대답을 업데이트했습니다. – knownasilya

+0

업데이트 해 주셔서 감사합니다. 내 문제에 대한 자세한 내용을 추가했습니다. 다른 방법으로 이동하는 방식이 좋지만 여전히 PiecePhotos를 먼저 업로드 한 다음 Piece와 연결해야하는 문제가 있습니다. – babalooi

2

나는 이것이 이전 질문 이었지만 이번 주에 같은 문제가 있었으며 마침내 작동하도록 만들었으므로 다른 누구도 같은 문제에 부딪혔을 때 대답 할 것이라고 생각했습니다.

기본적으로 Paperclip은 Interpolations (paperclip/interpolations)를 통해 동적 경로를 사용할 수 있습니다. 그냥 보간 코드를

PiecePhoto 모델을 추가 할 필요가 모델의 상단에,이 작업을 수행하려면 :

이제
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", 

그리고 남은 것은 정의하는 것입니다. 레일즈. 매개 변수를 사용할 수도 있습니다. #{image_file_name} 또는 필드 이름이 무엇이든간에 입력하고 .parameterize을 추가하십시오.

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

나는 내가 사용하고 무엇 때문에 내가 만, 레일 4.2이 테스트 한 인정하지만, 나는 많은 좌절 후 작업 얻을 수있었습니다.