So stuck, yet easy problem

Hi,

I’ve been working on a simple but useful application that uses draggable
Ajax tags to associate photos with people. I have the tags working and
the
photo list working, but I cannot seem make add the tagging association
in
the database.

The relevant code is posted below. My guess is that it has something to
do
with the PhotosController, although I don’t know anymore…I’ve tried
every
combination of code I could think of. I really don’t want to give up on
this project, so I would be so grateful for your help!

Thanks,

Michael

this might take a big rewrite, since I’ve had 2000 versions of it

PhotosController …
def addtag
@person_id = params[:id].split("_")[1]
@photo_id = params[:photo]
@photo = Photo.find(@photo_id)
@photo.people = @person_id
if @photo.update_attributes()
flash[:notice] = ‘Success!!’
redirect_to :action => ‘show’, :id => photo
end
end

tagging.rhtml (views) ## page where the tagging is done …
<% for photo in @photos %>
<div id="<%= “photo_#{photo.id}” %>" style=“float:left; padding:
0 5
5 0;”>
<%= link_to(image_tag(“photos/#{photo.thumbnail}”,
:size => ‘200’,
:border => 0,
:id => ‘thumbnail’),
url_for(:action => ‘show’, :id => photo)
)
%>


<%= image_tag “indicator.gif” %> Updating…

<%= drop_receiving_element(“photo_#{photo.id}”,
:url => {:controller => “photos”, :action => “addtag”},
:photo => “#{photo.id}”, ## added this because I’m not
sure
the Controller knows both ids of dropped tag and photo being tagged
:loading => “Element.show(‘indicator’)”,
:complete => “Element.hide(‘indicator’)”)
%>
    </div>

<% end %>

class Person < ActiveRecord::Base
has_and_belongs_to_many :photos
End

class Photo < ActiveRecord::Base
validates_presence_of :filename

has_and_belongs_to_many :people
End

This is what my database looks like:

Table “photos”
“filename”, :string
“description”, :text
“thumbnail”, :string
“date_taken”, :date

Table “people_photos”
“person_id”, :integer
“person_id”, :integer

Table “people”
“firstname”, :string
“lastname”, :string
“email”, :string
“school”, :string

@photo.people = @person_id
if @photo.update_attributes()

These two lines should be:

@photo.people << Person.find(@person_id)
if @photo.save

unless I’m misunderstanding your original code…

Jeff

Table “people_photos”
“person_id”, :integer
“person_id”, :integer

should be

person_id
photo_id

if this was only a typo you should add the error stack trace.

Cheers,
Jan

MichaelM wrote:

The only line that doesn’t work is @photo.save, which doesn’t then
flash “Success!!”. When I added an else statement, it also didn’t
evaluate. Not sure what’s going on there…

Thanks again!

Hmmm… Does the redirect to the ‘taggable’ action work? If so, it’s
probably just a bug in how you’re trying to display the flash notice.
Can you post taggable.rhtml?

If the redirect is not working either, then something else is going on,
like an exception is being raised somewhere that’s causing the entire
method to abort. Try enclosing the whole method body in a
begin/rescue/end structure, and write something to log each step of the
way, until you can see what’s going on.

Jeff

Thanks! It works! The ‘<<’ was the breakthrough. I also needed to
pass-back the id of the photo where the tag was dropped; this was done
using :where. Here’s the updated relevant working code.

The only line that doesn’t work is @photo.save, which doesn’t then
flash “Success!!”. When I added an else statement, it also didn’t
evaluate. Not sure what’s going on there…

Thanks again!

tagging.rhtml

<%= image_tag "indicator.gif" %> Updating...
<%= drop_receiving_element("photo_#{photo.id}", :url => {:controller => "photos", :action => "addtag", :where => "#{photo.id}"}, :loading => "Element.show('indicator')", :complete => "Element.hide('indicator')") %>

PhotosController


def addtag
@person_id = params[:id].split("_")[1]
@photo_id = params[:where]
@photo = Photo.find(@photo_id)
@photo.people << Person.find(@person_id)
if @photo.save
flash[:notice] = ‘Success!!’
redirect_to :action => ‘taggable’
end
end

MichaelM wrote:

Below is my ‘taging.rhtml’. I’m actually not quite sure how to do
begin-rescue-end you suggested. I’ve been struggling with this for so
long, I started another post.

http://groups.google.com/group/rubyonrails-talk/browse_frm/thread/7193bcc39ac82a01/044cae6079b7b382?lnk=raot#044cae6079b7b382

I’ll address the flash issue here, and the other issue in the other
thread…

Unless I’m missing it, I don’t see anywhere in your tagging.html that
actually displays the flash notice.

<% if flash[:notice] %>

<% flash[:notice] %>

<% end %>

Obviously the

is just an example, you can also use a div and style
it with css.

Jeff

Below is my ‘taging.rhtml’. I’m actually not quite sure how to do
begin-rescue-end you suggested. I’ve been struggling with this for so
long, I started another post.

http://groups.google.com/group/rubyonrails-talk/browse_frm/thread/7193bcc39ac82a01/044cae6079b7b382?lnk=raot#044cae6079b7b382

No luck yet, but I’ll be sure to post the solutions once I figure it
out (that is, IF I figure it out!)

tagging.rhtml

Tagging photos

<% @PHOTOS_ACROSS = 2 %>

<% for person in @all_people %> " class="nameSpan" style="border:1px solid #ffffee;display:block"><%= person.firstname + " " + person.lastname %> <%= draggable_element ("person_#{person.id}", :revert => true) %> <% end %>

<%= image_tag "indicator.gif" %> Updating...

<% for photo in @photos %>
" style="float:left;padding: 0 5 5 0; border:thin solid #000"> <%= link_to(image_tag("photos/#{photo.thumbnail}", :size => '200', :border => 0, :id => 'thumbnail'), url_for(:action => 'show', :id => photo) ) %>
        <%= drop_receiving_element("photo_#{photo.id}",
            :url => {:controller => "photos", :action => "addtag",

:where => “#{photo.id}”},
:loading => “Element.show(‘indicator’)”,
:complete => “Element.hide(‘indicator’)”)
%>

        <div id="listing">
            <%= render :partial => "taglist", :locals => {

:photo_tags => photo.people.find(:all) } %>

    </div>
<% end %>

<%= link_to 'Previous page', { :page =>

@photo_pages.current.previous } if @photo_pages.current.previous %>
<%= link_to ‘Next page’, { :page => @photo_pages.current.next } if
@photo_pages.current.next %>

Jeff C. wrote:

<% if flash[:notice] %>

<% flash[:notice] %>

<% end %>

I think that should be <%= flash[:notice] %> , no ? (equals sign)

I posted that exact code in tagging.rhtml, but it again doesn’t
display. It continues to display ‘Success!’ if I click to another
page. Do I need an if statment do display flash[:notice]? None of my
other (working) pages have it.

Alan F. wrote:

Jeff C. wrote:

<% if flash[:notice] %>

<% flash[:notice] %>

<% end %>

I think that should be <%= flash[:notice] %> , no ? (equals sign)

Also, I assume the flash display code is already present in the layout
file.

Two suggestions:

  1. regardless of any conditions or saving, set the flash to something
    crazy at the end of the action, just to make sure it can change.

  2. If that proves successful (ie changing the flash, changes the
    display) try using save! instead of save and see if you get an exception
    thrown.

Alan