Link to home
Start Free TrialLog in
Avatar of depassion
depassionFlag for Philippines

asked on

Polymorphic association with rails view links

so i have a polymorphic association. I want to display all posts, but can't get the view links to work
class Artist < ActiveRecord::Base
  has_many :posts, :as => :postable
end

class Label < ActiveRecord::Base
 has_many :posts, :as => :postable
end

class Post < ActiveRecord::Base
   belongs_to :postable, :polymorphic => true
end

class ApplicationController < ActionController::Base    
    def find_postable
      params.each do |name, value|
        if name =~ /(.+)_id$/
          @postable = $1.classify.constantize.find(value)
        end
      end
      nil
    end
end    

class InfoController < ApplicationController
  before_filter :find_postable
  def index
    @allposts = Post.find(:all, :order => 'created_at DESC', :limit => 10 )
  end

<% for post in @allposts %>
<div class="all_posts_post">
<h2 class="content_title">
<%= link_to post.title, ???????? %>

<%= link_to 'Edit', ??????? %>
<%= link_to 'Destroy', ?????? :method => :delete,  :confirm => 'Are you sure?' %>

Open in new window

Avatar of JESii
JESii
Flag of United States of America image

If you remove the before_filter, do you get anything displayed?
Avatar of depassion

ASKER

actually it doesn't seem to make any difference, this is exactly what i have;
class InfoController < ApplicationController

  def index
    @allgigs = Gig.find(:all, :order => 'starts ASC', :limit => 20, :conditions => [ "starts between ? and ?", Time.now, 7.days.since ] )
    @allposts = Post.find(:all, :order => 'created_at DESC', :limit => 10 )
    @alltags = Tag.find(:all)
  end
end

#app/views/info/index
<div id="all_posts">
 <h2 class="all_posts_title">Latest News</h2>
 <% for post in @allposts %>
 <div class="all_posts_post">
 <h2 class="content_title"><%= link_to post.title, [@postable, post] %></h2>
<% if post.post_image.exists? %>
<div class="all_posts_post_img">
<%= image_tag post.post_image.url(:thumb) %>
<!-- END .all_posts_post_img --></div>	
<% end -%>
<p class="date">Posted <%= distance_of_time_in_words_to_now(post.created_at) %> ago</p>
<div class="all_posts_body">
<%= auto_link truncate(post.body, :length => 270) %>
<!-- END .all_posts_body --></div>
<div class="tag_list">
<% for tag in post.tags %>
<span class="tags"><%= link_to tag.name, tag_path(tag) %></span>
<% end -%>
<!-- END .tag_list --></div>
<% if admin? %>
<%= link_to 'Edit', polymorphic_url([post.postable, post], :action => :edit) %>
<%= link_to 'Destroy', [post.postable, post], :method => :delete,  :confirm => 'Are you sure?' %>
<% end -%>
<div class="content_clear_with_hr"></div>	
<!-- END .all_posts_post --></div>
<% end -%>	
<!-- END #all_posts --></div>

#error
undefined method `post_path' for #<ActionView::Base:0x1031147d0>

Open in new window

Ah! lines 40: Undefined method 'post_path"...  believe that means you are having routes problems.

You may need to say "posts_path" [note the plural]

If that doesn't work, type the following in your shell:
  rake routes
to see what is actually defined in your system.

...jon


artist_gigs GET    /artists/:artist_id/gigs(.:format)              {:controller=>"gigs", :action=>"index"}
                    POST   /artists/:artist_id/gigs(.:format)              {:controller=>"gigs", :action=>"create"}
     new_artist_gig GET    /artists/:artist_id/gigs/new(.:format)          {:controller=>"gigs", :action=>"new"}
    edit_artist_gig GET    /artists/:artist_id/gigs/:id/edit(.:format)     {:controller=>"gigs", :action=>"edit"}
         artist_gig GET    /artists/:artist_id/gigs/:id(.:format)          {:controller=>"gigs", :action=>"show"}
                    PUT    /artists/:artist_id/gigs/:id(.:format)          {:controller=>"gigs", :action=>"update"}
                    DELETE /artists/:artist_id/gigs/:id(.:format)          {:controller=>"gigs", :action=>"destroy"}
       artist_posts GET    /artists/:artist_id/posts(.:format)             {:controller=>"posts", :action=>"index"}
                    POST   /artists/:artist_id/posts(.:format)             {:controller=>"posts", :action=>"create"}
    new_artist_post GET    /artists/:artist_id/posts/new(.:format)         {:controller=>"posts", :action=>"new"}
   edit_artist_post GET    /artists/:artist_id/posts/:id/edit(.:format)    {:controller=>"posts", :action=>"edit"}
        artist_post GET    /artists/:artist_id/posts/:id(.:format)         {:controller=>"posts", :action=>"show"}
                    PUT    /artists/:artist_id/posts/:id(.:format)         {:controller=>"posts", :action=>"update"}
                    DELETE /artists/:artist_id/posts/:id(.:format)         {:controller=>"posts", :action=>"destroy"}
       artist_links GET    /artists/:artist_id/links(.:format)             {:controller=>"links", :action=>"index"}
                    POST   /artists/:artist_id/links(.:format)             {:controller=>"links", :action=>"create"}
    new_artist_link GET    /artists/:artist_id/links/new(.:format)         {:controller=>"links", :action=>"new"}
   edit_artist_link GET    /artists/:artist_id/links/:id/edit(.:format)    {:controller=>"links", :action=>"edit"}
        artist_link GET    /artists/:artist_id/links/:id(.:format)         {:controller=>"links", :action=>"show"}
                    PUT    /artists/:artist_id/links/:id(.:format)         {:controller=>"links", :action=>"update"}
                    DELETE /artists/:artist_id/links/:id(.:format)         {:controller=>"links", :action=>"destroy"}
      artist_videos GET    /artists/:artist_id/videos(.:format)            {:controller=>"videos", :action=>"index"}
                    POST   /artists/:artist_id/videos(.:format)            {:controller=>"videos", :action=>"create"}
   new_artist_video GET    /artists/:artist_id/videos/new(.:format)        {:controller=>"videos", :action=>"new"}
  edit_artist_video GET    /artists/:artist_id/videos/:id/edit(.:format)   {:controller=>"videos", :action=>"edit"}
       artist_video GET    /artists/:artist_id/videos/:id(.:format)        {:controller=>"videos", :action=>"show"}
                    PUT    /artists/:artist_id/videos/:id(.:format)        {:controller=>"videos", :action=>"update"}
                    DELETE /artists/:artist_id/videos/:id(.:format)        {:controller=>"videos", :action=>"destroy"}
      artist_charts GET    /artists/:artist_id/charts(.:format)            {:controller=>"charts", :action=>"index"}
                    POST   /artists/:artist_id/charts(.:format)            {:controller=>"charts", :action=>"create"}
   new_artist_chart GET    /artists/:artist_id/charts/new(.:format)        {:controller=>"charts", :action=>"new"}
  edit_artist_chart GET    /artists/:artist_id/charts/:id/edit(.:format)   {:controller=>"charts", :action=>"edit"}
       artist_chart GET    /artists/:artist_id/charts/:id(.:format)        {:controller=>"charts", :action=>"show"}
                    PUT    /artists/:artist_id/charts/:id(.:format)        {:controller=>"charts", :action=>"update"}
                    DELETE /artists/:artist_id/charts/:id(.:format)        {:controller=>"charts", :action=>"destroy"}
      artist_images GET    /artists/:artist_id/images(.:format)            {:controller=>"images", :action=>"index"}
                    POST   /artists/:artist_id/images(.:format)            {:controller=>"images", :action=>"create"}
   new_artist_image GET    /artists/:artist_id/images/new(.:format)        {:controller=>"images", :action=>"new"}
  edit_artist_image GET    /artists/:artist_id/images/:id/edit(.:format)   {:controller=>"images", :action=>"edit"}
       artist_image GET    /artists/:artist_id/images/:id(.:format)        {:controller=>"images", :action=>"show"}
                    PUT    /artists/:artist_id/images/:id(.:format)        {:controller=>"images", :action=>"update"}
                    DELETE /artists/:artist_id/images/:id(.:format)        {:controller=>"images", :action=>"destroy"}
    artist_podcasts GET    /artists/:artist_id/podcasts(.:format)          {:controller=>"podcasts", :action=>"index"}
                    POST   /artists/:artist_id/podcasts(.:format)          {:controller=>"podcasts", :action=>"create"}
 new_artist_podcast GET    /artists/:artist_id/podcasts/new(.:format)      {:controller=>"podcasts", :action=>"new"}
edit_artist_podcast GET    /artists/:artist_id/podcasts/:id/edit(.:format) {:controller=>"podcasts", :action=>"edit"}
     artist_podcast GET    /artists/:artist_id/podcasts/:id(.:format)      {:controller=>"podcasts", :action=>"show"}
                    PUT    /artists/:artist_id/podcasts/:id(.:format)      {:controller=>"podcasts", :action=>"update"}
                    DELETE /artists/:artist_id/podcasts/:id(.:format)      {:controller=>"podcasts", :action=>"destroy"}
      artist_tracks GET    /artists/:artist_id/tracks(.:format)            {:controller=>"tracks", :action=>"index"}
                    POST   /artists/:artist_id/tracks(.:format)            {:controller=>"tracks", :action=>"create"}
   new_artist_track GET    /artists/:artist_id/tracks/new(.:format)        {:controller=>"tracks", :action=>"new"}
  edit_artist_track GET    /artists/:artist_id/tracks/:id/edit(.:format)   {:controller=>"tracks", :action=>"edit"}
       artist_track GET    /artists/:artist_id/tracks/:id(.:format)        {:controller=>"tracks", :action=>"show"}
                    PUT    /artists/:artist_id/tracks/:id(.:format)        {:controller=>"tracks", :action=>"update"}
                    DELETE /artists/:artist_id/tracks/:id(.:format)        {:controller=>"tracks", :action=>"destroy"}
            artists GET    /artists(.:format)                              {:controller=>"artists", :action=>"index"}
                    POST   /artists(.:format)                              {:controller=>"artists", :action=>"create"}
         new_artist GET    /artists/new(.:format)                          {:controller=>"artists", :action=>"new"}
        edit_artist GET    /artists/:id/edit(.:format)                     {:controller=>"artists", :action=>"edit"}
             artist GET    /artists/:id(.:format)                          {:controller=>"artists", :action=>"show"}
                    PUT    /artists/:id(.:format)                          {:controller=>"artists", :action=>"update"}
                    DELETE /artists/:id(.:format)                          {:controller=>"artists", :action=>"destroy"}
        label_posts GET    /labels/:label_id/posts(.:format)               {:controller=>"posts", :action=>"index"}
                    POST   /labels/:label_id/posts(.:format)               {:controller=>"posts", :action=>"create"}
     new_label_post GET    /labels/:label_id/posts/new(.:format)           {:controller=>"posts", :action=>"new"}
    edit_label_post GET    /labels/:label_id/posts/:id/edit(.:format)      {:controller=>"posts", :action=>"edit"}
         label_post GET    /labels/:label_id/posts/:id(.:format)           {:controller=>"posts", :action=>"show"}
                    PUT    /labels/:label_id/posts/:id(.:format)           {:controller=>"posts", :action=>"update"}
                    DELETE /labels/:label_id/posts/:id(.:format)           {:controller=>"posts", :action=>"destroy"}
             labels GET    /labels(.:format)                               {:controller=>"labels", :action=>"index"}
                    POST   /labels(.:format)                               {:controller=>"labels", :action=>"create"}
          new_label GET    /labels/new(.:format)                           {:controller=>"labels", :action=>"new"}
         edit_label GET    /labels/:id/edit(.:format)                      {:controller=>"labels", :action=>"edit"}
              label GET    /labels/:id(.:format)                           {:controller=>"labels", :action=>"show"}
                    PUT    /labels/:id(.:format)                           {:controller=>"labels", :action=>"update"}
                    DELETE /labels/:id(.:format)                           {:controller=>"labels", :action=>"destroy"}
           sessions GET    /sessions(.:format)                             {:controller=>"sessions", :action=>"index"}
                    POST   /sessions(.:format)                             {:controller=>"sessions", :action=>"create"}
        new_session GET    /sessions/new(.:format)                         {:controller=>"sessions", :action=>"new"}
       edit_session GET    /sessions/:id/edit(.:format)                    {:controller=>"sessions", :action=>"edit"}
            session GET    /sessions/:id(.:format)                         {:controller=>"sessions", :action=>"show"}
                    PUT    /sessions/:id(.:format)                         {:controller=>"sessions", :action=>"update"}
                    DELETE /sessions/:id(.:format)                         {:controller=>"sessions", :action=>"destroy"}
               tags GET    /tags(.:format)                                 {:controller=>"tags", :action=>"index"}
                    POST   /tags(.:format)                                 {:controller=>"tags", :action=>"create"}
            new_tag GET    /tags/new(.:format)                             {:controller=>"tags", :action=>"new"}
           edit_tag GET    /tags/:id/edit(.:format)                        {:controller=>"tags", :action=>"edit"}
                tag GET    /tags/:id(.:format)                             {:controller=>"tags", :action=>"show"}
                    PUT    /tags/:id(.:format)                             {:controller=>"tags", :action=>"update"}
                    DELETE /tags/:id(.:format)                             {:controller=>"tags", :action=>"destroy"}
                    GET    /contact                                        {:controller=>"contact", :action=>"index"}
                    POST   /contact                                        {:controller=>"contact", :action=>"create"}
                    GET    /booking                                        {:controller=>"contact", :action=>"booking"}
            contact POST   /booking                                        {:controller=>"contact", :action=>"create_booking"}
               root        /                                               {:controller=>"info", :action=>"index"}
              login        /login                                          {:controller=>"sessions", :action=>"new"}
             logout        /logout                                         {:controller=>"sessions", :action=>"destroy"}
                           /:controller/:action/:id      

Open in new window

ASKER CERTIFIED SOLUTION
Avatar of JESii
JESii
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial