I have a rails app that consists of a CMS system that I use in order to enter sights from a city to my database. I am using paperclip to upload images to amazon s3. All is working fine. Now I want my json files that an ios app will use to include the urls of the images uploaded in s3. I have seen some answers here but I cannot seem to make my code work. What I have is this..
place model
attr_accessible :assets_attributes, :asset
has_many :assets
accepts_nested_attributes_for :assets, :allow_destroy => true
def avatar_url
assets.map(&:asset_url)
end
asset model
class Asset < ActiveRecord::Base
attr_accessible :asset_content_type, :asset_file_name, :asset_file_size, :asset_updated_at, :place_id, :asset
belongs_to :place
has_attached_file :asset
validates_attachment :asset, :presence => true,
:content_type => { :content_type => ['image/jpeg', 'image/png'] },
:size => { :in => 0..1.megabytes }
def asset_url
asset.url(:original)
end
end
view code
<%= f.fields_for :assets do |asset_fields| %>
<% if asset_fields.object.new_record? %>
<p>
<%= asset_fields.file_field :asset %>
</p>
<% end %>
<% end %>
<br/>
<%= f.fields_for :assets do |asset_fields| %>
<% unless asset_fields.object.new_record? %>
<%= link_to image_tag(asset_fields.object.asset.url(:original), :class => "style_image"), (asset_fields.object.asset.url(:original)) %>
<%= asset_fields.check_box :_destroy %>
<% end %>
<% end %>
places controller
def index
@places = Place.all
render :json => @places.to_json(:methods => [:avatar_url])
end
Can anyone please help me?
In reference to the SO question you linked to (How can I get url for paperclip image in to_json), there are certain elements you'll need in order to get the image to render correctly
The problem you have is Paperclip's image
method is actually an ActiveRecord object, and therefore you cannot just render it in a JSON request without doing some other stuff
The _url
Method
The most important part of the process is to define the "_url" method in your asset
model. This basically calls the .url
function of Paperclip, allowing JSON to create the desired URL of the image on the fly (The url of the image is not an ActiveRecord object, and can therefore be sent via JSON)
As per the referenced SO question, you should put this action in your model:
#app/models/asset.rb
def asset_url
asset.url(:medium)
end
Now when you render the JSON request in your controller, you can use this type of setup:
#app/controllers/places_controller.rb
render :json => @places.to_json(:methods => [:asset_url])
Because your asset
model is an associate of places
, this might not work straight away. However, it's definitely in the right direction, because I can remember doing this exact thing myself
The important thing to note here, is that you're actually passing the naked "URL" of the image through JSON, not the image object itself
Update
Here's an example from our video conference demo app we made:
#app/controllers/profiles_controller.rb
def update
@profile = User.find(current_user.id)
@profile.profile.update(upload_params)
respond_to do |format|
format.html { render :nothing => true }
format.js { render :partial => 'profiles/update.js' }
format.json { render :json => @profile.profile.as_json(:only => [:id, :avatar], :methods => [:avatar_url])
}
end
end
#app/models/profile.rb
def avatar_url
avatar.url(:original)
end
So for you, I'd try this:
def index
@places = Place.all
render :json => @places.assets.as_json(:only => [:id, :asset], :methods => [:asset_url])
end
You could also try something like this:
#app/models/profile.rb
def avatar_url
self.asset.avatar.url(:original)
end
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With