开发者

Rails 3 - polymorphic_path - How to Create One given a table

i have table AuditLog with fields including: audited_id | audited_type

That results in data like: 108 | Photo 303 | Comment

What I want to do is create a link to the item, so for the example above:

here is the photo

I'm trying to use a polymorphic_path but am getting an error: "undefined method `model_name' for Fixnum:Class"

When using:

<%= link_to 'Here she is', polymorphic_path([audited_id, audited_type]) %>

Ideas? Thanks

Updating with code based on the answer by Luke below:

class NewsFeed < ActiveRecord::Base
    default_scope :order => 'news_feeds.created_at DESC'    
    belongs_to :feeded, :polymorphic => true
end

class Note < ActiveRecord::Base
  has_many :newsfeed, :as => :feeded
end

In the partial which is being passed 开发者_运维百科the local storyitem:

<%= link_to 'Here she is', polymorphic_path(storyitem.feeded) %>

The DB migration file, contains the following line for CreateNewsFeeds

  t.references :feeded, :polymorphic => true


You should have a method #auditable (or whatever your polymorphic association is called) on AuditLog objects. If you pass the result of that method to polymorphic_path it will return the correct path for you.

Update:

Assuming you have the following associations (or are using acts_as_auditable or something that sets up the relationships for you):

class AuditLog
  belongs_to :auditable, :polymorphic => true
end

class AuditedObject
  has_many :audits, :as => :auditable
end

You'll be able to call auditable on any instance of AuditLog, and it will return the associated audited object. So you can call

<%= link_to 'Here she is', polymorphic_path(audit_log.auditable) %>

to get a link to the audited object.

So, anywhere that you have a polymorphic association in a class, there is an instance method setup with the name of that association that will return the associated object.

Gosh, I'm hoping that makes sense. Let me know if you need me to clarify it further.


The problem with polymorphic_path it needs an object, so you first need to fetch the object from the database. Depending on your use case this can be a big performance problem. In case of a log viewer, where you have a list of for example 100 entries, and just want to show links to the entires, you will fetch 100 objects, just to get their path.

I had a similar problem, my solution was to hack a method to construct the path from the class name and id:

class AuditLog
...
def audited_path
    "/#{self.audited_type.tableize}/#{self.audited_id}"
end

The method will return for example "/photos/302". But of course it will work only for quite simple routings.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜