Ruby on Rails - image_tag links not working in posts - ruby-on-rails-3

trying to make link to my recent uploaded image
<%= link_to (image_tag (post.image_url(:thumb))), post.image.url(:original), :class => 'postimage' %>
how ever it's not working, at all...
<% #post.image do |image| %>
<%= link_to (image_tag (post.image_url(:thumb))), post.image.url(:original), :class => 'postimage' %>
<% end %>
the fun part is that
<%= #post.image %>
works. but only shows /uploads/post/image/3/eKoh3.jpg
full code here https://gist.github.com/4332533

This line looks wrong to me:
<% #post.image do |image| %>
(btw your gist actually says #post.image.each do |image|, which I'm assuming is what you meant to do above)
If you are mounting an uploader on your Post model's :image attribute, then this makes no sense. A mounted uploader allows you to upload one image, and you can't iterate over it using each.
I'm not sure what you're trying to do. Are you trying to iterate over all the versions? Try post.image.versions.each
Are you trying to upload multiple images? Carrierwave can't help you with that directly. You'll need to create a new model, Image, and mount your uploader there. Your Post will need a line like
has_many :images
And your Image model will need to belong_to :post. You'll also need to figure out how to upload and manage images in that new table.

Related

I want to update file to an existing rails record with carrierwave

I have a form where i am asking a user to upload a file.This file to be uploaded is supposed to be saved to a existing record. When a user upload this file i don't want it to be saved right away(because it will create a new record), i want to access the parameters in the controller and update image attribute to the existing record.Currently when i access the params and update_attribute, it shows like it did update but when i look in the database , image attribute is still nil. It works fine when i save directly as new record but it won't let me update manually,can somebody help me?
Thank you in advance
Form
<%= form_tag url_for(:controller=>"deal",:action=>"create_deal"),:method=>'get',:html=>{:multipart=>true} do %>
<%= file_field_tag :image, :value=> params[:image] %>
<%= submit_tag "upload" %>
<%end%>
Controller
def create_deal
#attachment = params[:image]
e_record = Deal.find(:last) #get existing record
if e_record.update_attribute(:image, #attachment)
redirect_to :action=>"profile"
end
end

Error using nested_form gem with empty association

In my rails app, I have two models, a ClientPage and a ContentSection, where ClientPage has_many :content_sections. I'm using the nested_form gem to both models to be edited with the same form. This works fine as long as the ClientPage has at least one ContentSection, but if there are no associated ClientSections, the using nested_form's link_to_add method throws the following NoMethodError:
undefined method `values_at' for nil:NilClass
The form is structured as follows:
<%= nested_form_for page, form_options do |f| %>
# ClientPage fields
# ClientSections
<%= f.link_to_add "Add new section", :content_sections %>
<% end %>
As long as there is at least one ClientSection associated with the page, this works fine. As soon as there isn't, the error is thrown. Removing the link_to_add also stops the error from being thrown. (There's actually a second nested model under ContentSection, and the same issue arises if there are no associated models.)
Not sure what I'm fairly obvious thing I'm missing, but any pointers or suggestions would be greatly appreciated.
Finally worked this out -- the error was due to the fact that I was using the gem in a slightly non-standard way. Within the form, instead of rendering all of the content sections the standard way:
<%= f.fields_for :content_sections do |section_form| %>
# section fields
<% end %>
I put it inside a loop, as I needed the index of each item (which is not stored within the model itself):
<% page.content_sections.each_with_index do |section, index| %>
<%= f.fields_for :content_sections, section do |section_form| %>
# section fields
<% end %>
<% end %>
The issue doing it this way is that the fields_for method does not get called if the association is empty, and as such the gem cannot build the blueprint for the object (which is used to add in the extra item when link_to_add is called).
The solution was to make sure fields_for got called even if the association was empty:
<% if page.content_sections.empty? %>
<%= f.fields_for :content_sections do |section_form| %>
# section fields
<% end %>
<% end %>

Link to download a file in rails

I want to send an email with some links to download from my s3 bucket. I have the url of the file stored in a table. How can I use the link_to helper?
<%= link_to "Download File x", #profile.document %>
Because I suppose that #profile.document is a full qualified url, you don't need link_to helper, simply use:
doc`.
Use link_to when you have a resource instance (like Profile probably) that is defined in the config/routes.rb file. For example:
resources :profile
then when you use
<%= link_to 'download', #profile %>
you will have
http://test.com/profiles/34234

Using Devise, I don't see notices like "you've signed in" when i log into my app

I'm building a basic app with Rails 3.2 and Devise 2.0. I've create a User devise model and a Projects model. In my routes.rb files I have
root :to => 'projects#index'
I can sign up and sign in at Get users/sign_up and Get users/sign_in, respectively, but when it redirects to projects#index, I don't see a notice at the top that says "You've signed in successfully. Which file do I need to check to fix this?
You need to add flash messages showing to the file /projects/index.html.erb
for example this way:
<% flash.each do |key, value| %>
<%= content_tag(:div, value, :class => "flash #{key}") %>
<% end %>

How do I access an instance variable from another controller?

So I have two models & controllers. Projects and Designers.
In my designers index view, I want it to show a list of all the projects that the designer has.
However, when I do a simple query like this:
<% #projects.each do |project| %>
<tr>
<td><%= link_to 'Show', project %></td>
<td><%= link_to 'Edit', edit_project_path(project) %></td>
<td><%= link_to 'Destroy', project, :confirm => 'Are you sure?', :method => :delete %></td>
</tr>
<% end %>
From the index.html.erb in the Designers view, it gives me the following error:
NoMethodError in Designers#index
You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each
However, when I run that EXACT code from the index.html.erb file in the projects view, it works perfectly.
So how am I able to access that controller or at least data from the view of another controller? Do I have to add a projects variable (where it queries the db) to my index object in my designers controller?
Thanks.
UPDATED TO USE A SINGLE DESIGNER RECORD
You should use associations. Add this to your models.
class Designer < ActiveRecord::Base
has_many :projects
end
class Project < ActiveRecord::Base
belongs_to :designer
end
Your view should look like this:
<% #designer.projects.each do |project| %>
<% end %>
More info on associations here:
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html
Figured out one way to do it. All I had to do was add an instance variable in my designers controller:
#projects = Project.all
But...that's not very DRY. Does anyone have a more elegant 'DRY' solution, so if I want to access other variables in other controllers I can do that easily without having to re-create them in the current controller?
Thanks.
In your designers controller, you need to set the #projects instance variable to only those projects belonging to the signed in designer, correct?
You'll need something like this:
def index
#projects = Project.where(:user_id => where ever you've stored your userid)
end
I hope this helps.