Building on my work in Separate Rights Management from Controllers i killed all linking-view-logic.
Example
before: (movie.online? or movie.owner_id==current_user.id) ? link_to(movie,movie) : '' (movie.owner_id==current_user.id) ? link_to('edit',movie) : '' after: link_to_s(movie) link_to_edit(movie)
Code
#app/helpers/link_helper.rb module LinkHelper def is_record?(something) something.kind_of?(ActiveRecord::Base) end def can_write?(obj) user = current_user || User.new user.can_write?(obj) end def can_read?(obj) user = current_user || User.new user.can_read?(obj) end #can we build a link ? #true if it is an id / path #false if it is an record and i cannot reda/write it def is_linkable?(object,rw) raise ":r or :w" unless [:r,:w].include? rw return false unless object return true unless is_record?(object) return rw == :r ? can_read?(object) : can_write?(object) end def link_to_s(object,options={}) return "" unless is_linkable?(object,:r) link_to(object.to_s,object,options) end def link_to_edit(path_or_object,options={}) return "" unless is_linkable?(path_or_object,:w) if is_record?(path_or_object) path_or_object = edit_polymorphic_path(path_or_object) end link_to("edit",path_or_object,options) end def link_to_destroy(path_or_object,options={}) return "" unless is_linkable?(path_or_object,:w) link_to( 'X', path_or_object, options.merge(:class=>'destroy')) end end
Please drop a comment if you can think of enhancements, if i can find more uses/methods i will build a new link-helper-plugin 🙂
Brilliant stuff 🙂 Kill’em all!
Looks really nice, I’ll have to try something like this on an upcoming project 🙂
BTW, can_read?(obj) and can_write?(obj) look awfully similar to your controller methods of the same name. I suppose you have something like the following on your controllers:
def can_read?(obj=nil)
user = current_user || User.new
user.can_read?(obj || requested_object)
end
helper_method :can_read?
(ditto for can_write?)
Ctrl+c Ctrl+v
now i have 🙂
i like the obj=nil idea, so far i used 2 different methods on controller(without argument)/helper(with argument)