My site is for posting album reviews, which are called Pins. The pins model has the following attributes:
:artist, :year, :title, :rank, :description, and :image
The image uses Paperclip and is stored on Amazon S3 if that matters
I am trying to allow a user to see a review that another user posted and click a link to more simply write their own review for that same album. So basically the link takes them to the Pin.new page and the form already has the :artist, :title, :image, and :year filled in.
I figured out how to do it while bringing ALL of the attributes, including the :description and :rank, which I don't want. I am also not able to bring over the image to the new form.
Here is the pins_controller.rb code I'm using:
def copy
@source = Pin.find(params[:id])
@pin = @source.dup
render 'new'
end
And in my show view:
<%= link_to "copy", copy_pin_path(params[:id]) %>
So question one is how to @source.dup only :artist, :title, and :year
question two is how to bring over the paperclip image. I tried adding this to my pins_controller.rb:
def copy
@source = Pin.find(params[:id])
@pin = @source.dup
@pin.image = @source.image
render 'new'
end
but that didn't work.
UPDATE: miller350 answered my first question, but I still can't get the paperclip image to copy over to the "new" form. In the console I can copy from one Pin record and save a new pin like this:
r = Pin.new
r.image = Pin.find(83).image
r.save
I think the issue is that the new pin form requires that an image is chosen from the user's PC before saving the pin. Whatever that function of Paperclip is, I think that is where I'm getting stuck.
For the first part, you could pull the attributes individually and set them to the instance variable, and for the second part, you could use URI.
def copy
@source = Pin.find(params[:id])
@image = URI.parse(@source.image)
@pin = Pin.new(artist: @source.artist, title: @source.title, year: @source.year, image: @image)
render 'new'
end
Here is what I ended up doing to copy the image to a new pin form.
I have Paperclip's image_remote_url functionality set up already, but I needed to add .to_s to the method below in the pin.rb:
def image_remote_url=(url_value)
self.image = URI.parse(url_value).to_s unless url_value.blank?
super
end
Then my controller:
def copy
@source = Pin.find(params[:id])
@image = @source.image.url
@pin = Pin.new(artist: @source.artist, album: @source.album, year: @source.year, image_remote_url: @image)
render 'new'
end
This pastes the url of the image into the new form. It only works on my Heroku production version, not the local version.
来源:https://stackoverflow.com/questions/27810317/copy-a-paperclip-image-to-a-new-record-in-rails-4