Skip to content

Instantly share code, notes, and snippets.

@aderyabin
Created December 7, 2010 09:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aderyabin/731631 to your computer and use it in GitHub Desktop.
Save aderyabin/731631 to your computer and use it in GitHub Desktop.
polymorphic_select_tag
# polymorphic_select_tag @item, :owner, Post.all(:order=>'created_at DESC').collect{|b| #[b.title, [Post, b.id]]}
def polymorphic_select_tag(object, field, option_array=[], options={}, html_options={})
option_tags = "<option #{'selected="selected"' if (object.try(field) == nil)}/>" +
option_array.map do |tuple|
"<option value='#{tuple[1][0]}-#{tuple[1][1]}' #{'selected="selected"' if ((object.try(field).try(:id).to_s == tuple[1][1].to_s && object.try(field).try(:type).to_s == tuple[1][0].to_s) rescue false)}>#{tuple[0]}</option>"
end.to_s
prefix = options[:prefix] || ''
object_id = object.id
object_type = object.class.name.downcase
select_tag_id = "__#{prefix}_#{object_type}_#{field}_select_#{object_id}__"
hidden_type_field_id = "#{prefix}_#{object_type}_#{field}_type_#{object_id}"
hidden_id_field_id = "#{prefix}_#{object_type}_#{field}_id_#{object_id}"
onchange = "$('##{hidden_id_field_id}').val($('##{select_tag_id}').val().split('-')[1]);"+
"$('##{hidden_type_field_id}').val($('##{select_tag_id}').val().split('-')[0]);"
hidden_field_tag("#{object_type}[#{field}_type]", object.try(field).try(:type).to_s, :id => hidden_type_field_id) +
hidden_field_tag("#{object_type}[#{field}_id]", object.try(field).try(:id).to_s, :id => hidden_id_field_id) +
select_tag(select_tag_id, option_tags,
html_options.merge(:onchange => onchange))
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment