mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
removes ActionView::Helpers::ScriptaculousHelper
This commit is contained in:
parent
5850f16935
commit
06bdaae071
5 changed files with 2 additions and 385 deletions
|
@ -21,7 +21,6 @@ module ActionView #:nodoc:
|
|||
autoload :OutputSafetyHelper
|
||||
autoload :RecordTagHelper
|
||||
autoload :SanitizeHelper
|
||||
autoload :ScriptaculousHelper
|
||||
autoload :SprocketsHelper
|
||||
autoload :TagHelper
|
||||
autoload :TextHelper
|
||||
|
@ -52,7 +51,6 @@ module ActionView #:nodoc:
|
|||
include OutputSafetyHelper
|
||||
include RecordTagHelper
|
||||
include SanitizeHelper
|
||||
include ScriptaculousHelper
|
||||
include SprocketsHelper
|
||||
include TagHelper
|
||||
include TextHelper
|
||||
|
|
|
@ -107,8 +107,8 @@ module ActionView
|
|||
# <%= javascript_include_tag :defaults %>
|
||||
# <% end %>
|
||||
#
|
||||
# That will place <tt>script</tt> tags for Prototype, Scriptaculous, and application.js (if it exists)
|
||||
# on the page; this technique is useful if you'll only be using these scripts in a few views.
|
||||
# That will place +script+ tags for your default set of JavaScript files on the page;
|
||||
# this technique is useful if you'll only be using these scripts in a few views.
|
||||
#
|
||||
# Note that content_for concatenates the blocks it is given for a particular
|
||||
# identifier in order. For example:
|
||||
|
|
|
@ -1,39 +1,7 @@
|
|||
require 'action_view/helpers/tag_helper'
|
||||
|
||||
module ActionView
|
||||
# = Action View JavaScript Helpers
|
||||
module Helpers
|
||||
# Provides functionality for working with JavaScript in your views.
|
||||
#
|
||||
# == Ajax, controls and visual effects
|
||||
#
|
||||
# * For information on using Ajax, see
|
||||
# ActionView::Helpers::PrototypeHelper.
|
||||
# * For information on using controls and visual effects, see
|
||||
# ActionView::Helpers::ScriptaculousHelper.
|
||||
#
|
||||
# == Including the JavaScript libraries into your pages
|
||||
#
|
||||
# Rails includes the Prototype JavaScript framework and the Scriptaculous
|
||||
# JavaScript controls and visual effects library. If you wish to use
|
||||
# these libraries and their helpers (ActionView::Helpers::PrototypeHelper
|
||||
# and ActionView::Helpers::ScriptaculousHelper), you must do one of the
|
||||
# following:
|
||||
#
|
||||
# * Use <tt><%= javascript_include_tag :defaults %></tt> in the HEAD
|
||||
# section of your page (recommended): This function will return
|
||||
# references to the JavaScript files created by the +rails+ command in
|
||||
# your <tt>public/javascripts</tt> directory. Using it is recommended as
|
||||
# the browser can then cache the libraries instead of fetching all the
|
||||
# functions anew on every request.
|
||||
# * Use <tt><%= javascript_include_tag 'prototype' %></tt>: As above, but
|
||||
# will only include the Prototype core library, which means you are able
|
||||
# to use all basic AJAX functionality. For the Scriptaculous-based
|
||||
# JavaScript helpers, like visual effects, autocompletion, drag and drop
|
||||
# and so on, you should use the method described above.
|
||||
#
|
||||
# For documentation on +javascript_include_tag+ see
|
||||
# ActionView::Helpers::AssetTagHelper.
|
||||
module JavaScriptHelper
|
||||
include PrototypeHelper
|
||||
|
||||
|
|
|
@ -1,263 +0,0 @@
|
|||
require 'action_view/helpers/javascript_helper'
|
||||
require 'active_support/json'
|
||||
|
||||
module ActionView
|
||||
# = Action View Scriptaculous Helpers
|
||||
module Helpers
|
||||
# Provides a set of helpers for calling Scriptaculous[http://script.aculo.us/]
|
||||
# JavaScript functions, including those which create Ajax controls and visual
|
||||
# effects.
|
||||
#
|
||||
# To be able to use these helpers, you must include the Prototype
|
||||
# JavaScript framework and the Scriptaculous JavaScript library in your
|
||||
# pages. See the documentation for ActionView::Helpers::JavaScriptHelper
|
||||
# for more information on including the necessary JavaScript.
|
||||
#
|
||||
# The Scriptaculous helpers' behavior can be tweaked with various options.
|
||||
#
|
||||
# See the documentation at http://script.aculo.us for more information on
|
||||
# using these helpers in your application.
|
||||
module ScriptaculousHelper
|
||||
TOGGLE_EFFECTS = [:toggle_appear, :toggle_slide, :toggle_blind]
|
||||
|
||||
# Returns a JavaScript snippet to be used on the Ajax callbacks for
|
||||
# starting visual effects.
|
||||
#
|
||||
# If no +element_id+ is given, it assumes "element" which should be a local
|
||||
# variable in the generated JavaScript execution context. This can be
|
||||
# used for example with +drop_receiving_element+:
|
||||
#
|
||||
# <%= drop_receiving_element (...), :loading => visual_effect(:fade) %>
|
||||
#
|
||||
# This would fade the element that was dropped on the drop receiving
|
||||
# element.
|
||||
#
|
||||
# For toggling visual effects, you can use <tt>:toggle_appear</tt>, <tt>:toggle_slide</tt>, and
|
||||
# <tt>:toggle_blind</tt> which will alternate between appear/fade, slidedown/slideup, and
|
||||
# blinddown/blindup respectively.
|
||||
#
|
||||
# You can change the behaviour with various options, see
|
||||
# http://script.aculo.us for more documentation.
|
||||
def visual_effect(name, element_id = false, js_options = {})
|
||||
element = element_id ? ActiveSupport::JSON.encode(element_id) : "element"
|
||||
|
||||
js_options[:queue] = if js_options[:queue].is_a?(Hash)
|
||||
'{' + js_options[:queue].map {|k, v| k == :limit ? "#{k}:#{v}" : "#{k}:'#{v}'" }.join(',') + '}'
|
||||
elsif js_options[:queue]
|
||||
"'#{js_options[:queue]}'"
|
||||
end if js_options[:queue]
|
||||
|
||||
[:endcolor, :direction, :startcolor, :scaleMode, :restorecolor].each do |option|
|
||||
js_options[option] = "'#{js_options[option]}'" if js_options[option]
|
||||
end
|
||||
|
||||
if TOGGLE_EFFECTS.include? name.to_sym
|
||||
"Effect.toggle(#{element},'#{name.to_s.gsub(/^toggle_/,'')}',#{options_for_javascript(js_options)});"
|
||||
else
|
||||
"new Effect.#{name.to_s.camelize}(#{element},#{options_for_javascript(js_options)});"
|
||||
end
|
||||
end
|
||||
|
||||
# Makes the element with the DOM ID specified by +element_id+ sortable
|
||||
# by drag-and-drop and make an Ajax call whenever the sort order has
|
||||
# changed. By default, the action called gets the serialized sortable
|
||||
# element as parameters.
|
||||
#
|
||||
# Example:
|
||||
#
|
||||
# <%= sortable_element("my_list", :url => { :action => "order" }) %>
|
||||
#
|
||||
# In the example, the action gets a "my_list" array parameter
|
||||
# containing the values of the ids of elements the sortable consists
|
||||
# of, in the current order.
|
||||
#
|
||||
# Important: For this to work, the sortable elements must have id
|
||||
# attributes in the form "string_identifier". For example, "item_1". Only
|
||||
# the identifier part of the id attribute will be serialized.
|
||||
#
|
||||
# Additional +options+ are:
|
||||
#
|
||||
# * <tt>:format</tt> - A regular expression to determine what to send as the
|
||||
# serialized id to the server (the default is <tt>/^[^_]*_(.*)$/</tt>).
|
||||
#
|
||||
# * <tt>:constraint</tt> - Whether to constrain the dragging to either
|
||||
# <tt>:horizontal</tt> or <tt>:vertical</tt> (or false to make it unconstrained).
|
||||
#
|
||||
# * <tt>:overlap</tt> - Calculate the item overlap in the <tt>:horizontal</tt>
|
||||
# or <tt>:vertical</tt> direction.
|
||||
#
|
||||
# * <tt>:tag</tt> - Which children of the container element to treat as
|
||||
# sortable (default is <tt>li</tt>).
|
||||
#
|
||||
# * <tt>:containment</tt> - Takes an element or array of elements to treat as
|
||||
# potential drop targets (defaults to the original target element).
|
||||
#
|
||||
# * <tt>:only</tt> - A CSS class name or array of class names used to filter
|
||||
# out child elements as candidates.
|
||||
#
|
||||
# * <tt>:scroll</tt> - Determines whether to scroll the list during drag
|
||||
# operations if the list runs past the visual border.
|
||||
#
|
||||
# * <tt>:tree</tt> - Determines whether to treat nested lists as part of the
|
||||
# main sortable list. This means that you can create multi-layer lists,
|
||||
# and not only sort items at the same level, but drag and sort items
|
||||
# between levels.
|
||||
#
|
||||
# * <tt>:hoverclass</tt> - If set, the Droppable will have this additional CSS class
|
||||
# when an accepted Draggable is hovered over it.
|
||||
#
|
||||
# * <tt>:handle</tt> - Sets whether the element should only be draggable by an
|
||||
# embedded handle. The value may be a string referencing a CSS class value
|
||||
# (as of script.aculo.us V1.5). The first child/grandchild/etc. element
|
||||
# found within the element that has this CSS class value will be used as
|
||||
# the handle.
|
||||
#
|
||||
# * <tt>:ghosting</tt> - Clones the element and drags the clone, leaving
|
||||
# the original in place until the clone is dropped (default is <tt>false</tt>).
|
||||
#
|
||||
# * <tt>:dropOnEmpty</tt> - If true the Sortable container will be made into
|
||||
# a Droppable, that can receive a Draggable (as according to the containment
|
||||
# rules) as a child element when there are no more elements inside (default
|
||||
# is <tt>false</tt>).
|
||||
#
|
||||
# * <tt>:onChange</tt> - Called whenever the sort order changes while dragging. When
|
||||
# dragging from one Sortable to another, the callback is called once on each
|
||||
# Sortable. Gets the affected element as its parameter.
|
||||
#
|
||||
# * <tt>:onUpdate</tt> - Called when the drag ends and the Sortable's order is
|
||||
# changed in any way. When dragging from one Sortable to another, the callback
|
||||
# is called once on each Sortable. Gets the container as its parameter.
|
||||
#
|
||||
# See http://script.aculo.us for more documentation.
|
||||
def sortable_element(element_id, options = {})
|
||||
javascript_tag(sortable_element_js(element_id, options).chop!)
|
||||
end
|
||||
|
||||
def sortable_element_js(element_id, options = {}) #:nodoc:
|
||||
options[:with] ||= "Sortable.serialize(#{ActiveSupport::JSON.encode(element_id)})"
|
||||
options[:onUpdate] ||= "function(){" + remote_function(options) + "}"
|
||||
options.delete_if { |key, value| PrototypeHelper::AJAX_OPTIONS.include?(key) }
|
||||
|
||||
[:tag, :overlap, :constraint, :handle].each do |option|
|
||||
options[option] = "'#{options[option]}'" if options[option]
|
||||
end
|
||||
|
||||
options[:containment] = array_or_string_for_javascript(options[:containment]) if options[:containment]
|
||||
options[:only] = array_or_string_for_javascript(options[:only]) if options[:only]
|
||||
|
||||
%(Sortable.create(#{ActiveSupport::JSON.encode(element_id)}, #{options_for_javascript(options)});)
|
||||
end
|
||||
|
||||
# Makes the element with the DOM ID specified by +element_id+ draggable.
|
||||
#
|
||||
# Example:
|
||||
# <%= draggable_element("my_image", :revert => true)
|
||||
#
|
||||
# You can change the behaviour with various options, see
|
||||
# http://script.aculo.us for more documentation.
|
||||
def draggable_element(element_id, options = {})
|
||||
javascript_tag(draggable_element_js(element_id, options).chop!)
|
||||
end
|
||||
|
||||
def draggable_element_js(element_id, options = {}) #:nodoc:
|
||||
%(new Draggable(#{ActiveSupport::JSON.encode(element_id)}, #{options_for_javascript(options)});)
|
||||
end
|
||||
|
||||
# Makes the element with the DOM ID specified by +element_id+ receive
|
||||
# dropped draggable elements (created by +draggable_element+).
|
||||
# and make an AJAX call. By default, the action called gets the DOM ID
|
||||
# of the element as parameter.
|
||||
#
|
||||
# Example:
|
||||
# <%= drop_receiving_element("my_cart", :url =>
|
||||
# { :controller => "cart", :action => "add" }) %>
|
||||
#
|
||||
# You can change the behaviour with various options, see
|
||||
# http://script.aculo.us for more documentation.
|
||||
#
|
||||
# Some of these +options+ include:
|
||||
# * <tt>:accept</tt> - Set this to a string or an array of strings describing the
|
||||
# allowable CSS classes that the +draggable_element+ must have in order
|
||||
# to be accepted by this +drop_receiving_element+.
|
||||
#
|
||||
# * <tt>:confirm</tt> - Adds a confirmation dialog. Example:
|
||||
#
|
||||
# :confirm => "Are you sure you want to do this?"
|
||||
#
|
||||
# * <tt>:hoverclass</tt> - If set, the +drop_receiving_element+ will have
|
||||
# this additional CSS class when an accepted +draggable_element+ is
|
||||
# hovered over it.
|
||||
#
|
||||
# * <tt>:onDrop</tt> - Called when a +draggable_element+ is dropped onto
|
||||
# this element. Override this callback with a JavaScript expression to
|
||||
# change the default drop behaviour. Example:
|
||||
#
|
||||
# :onDrop => "function(draggable_element, droppable_element, event) { alert('I like bananas') }"
|
||||
#
|
||||
# This callback gets three parameters: The Draggable element, the Droppable
|
||||
# element and the Event object. You can extract additional information about
|
||||
# the drop - like if the Ctrl or Shift keys were pressed - from the Event object.
|
||||
#
|
||||
# * <tt>:with</tt> - A JavaScript expression specifying the parameters for
|
||||
# the XMLHttpRequest. Any expressions should return a valid URL query string.
|
||||
def drop_receiving_element(element_id, options = {})
|
||||
javascript_tag(drop_receiving_element_js(element_id, options).chop!)
|
||||
end
|
||||
|
||||
def drop_receiving_element_js(element_id, options = {}) #:nodoc:
|
||||
options[:with] ||= "'id=' + encodeURIComponent(element.id)"
|
||||
options[:onDrop] ||= "function(element){" + remote_function(options) + "}"
|
||||
options.delete_if { |key, value| PrototypeHelper::AJAX_OPTIONS.include?(key) }
|
||||
|
||||
options[:accept] = array_or_string_for_javascript(options[:accept]) if options[:accept]
|
||||
options[:hoverclass] = "'#{options[:hoverclass]}'" if options[:hoverclass]
|
||||
|
||||
# Confirmation happens during the onDrop callback, so it can be removed from the options
|
||||
options.delete(:confirm) if options[:confirm]
|
||||
|
||||
%(Droppables.add(#{ActiveSupport::JSON.encode(element_id)}, #{options_for_javascript(options)});)
|
||||
end
|
||||
|
||||
protected
|
||||
def array_or_string_for_javascript(option)
|
||||
if option.kind_of?(Array)
|
||||
"['#{option.join('\',\'')}']"
|
||||
elsif !option.nil?
|
||||
"'#{option}'"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
module PrototypeHelper
|
||||
class JavaScriptGenerator
|
||||
module GeneratorMethods
|
||||
# Starts a script.aculo.us visual effect. See
|
||||
# ActionView::Helpers::ScriptaculousHelper for more information.
|
||||
def visual_effect(name, id = nil, options = {})
|
||||
record @context.send(:visual_effect, name, id, options)
|
||||
end
|
||||
|
||||
# Creates a script.aculo.us sortable element. Useful
|
||||
# to recreate sortable elements after items get added
|
||||
# or deleted.
|
||||
# See ActionView::Helpers::ScriptaculousHelper for more information.
|
||||
def sortable(id, options = {})
|
||||
record @context.send(:sortable_element_js, id, options)
|
||||
end
|
||||
|
||||
# Creates a script.aculo.us draggable element.
|
||||
# See ActionView::Helpers::ScriptaculousHelper for more information.
|
||||
def draggable(id, options = {})
|
||||
record @context.send(:draggable_element_js, id, options)
|
||||
end
|
||||
|
||||
# Creates a script.aculo.us drop receiving element.
|
||||
# See ActionView::Helpers::ScriptaculousHelper for more information.
|
||||
def drop_receiving(id, options = {})
|
||||
record @context.send(:drop_receiving_element_js, id, options)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,86 +0,0 @@
|
|||
require 'abstract_unit'
|
||||
|
||||
class ScriptaculousHelperTest < ActionView::TestCase
|
||||
tests ActionView::Helpers::ScriptaculousHelper
|
||||
|
||||
def url_for(options)
|
||||
url = "http://www.example.com/"
|
||||
url << options[:action].to_s if options and options[:action]
|
||||
url
|
||||
end
|
||||
|
||||
def test_effect
|
||||
assert_equal "new Effect.Highlight(\"posts\",{});", visual_effect(:highlight, "posts")
|
||||
assert_equal "new Effect.Highlight(\"posts\",{});", visual_effect("highlight", :posts)
|
||||
assert_equal "new Effect.Highlight(\"posts\",{});", visual_effect(:highlight, :posts)
|
||||
assert_equal "new Effect.Fade(\"fademe\",{duration:4.0});", visual_effect(:fade, "fademe", :duration => 4.0)
|
||||
assert_equal "new Effect.Shake(element,{});", visual_effect(:shake)
|
||||
assert_equal "new Effect.DropOut(\"dropme\",{queue:'end'});", visual_effect(:drop_out, 'dropme', :queue => :end)
|
||||
assert_equal "new Effect.Highlight(\"status\",{endcolor:'#EEEEEE'});", visual_effect(:highlight, 'status', :endcolor => '#EEEEEE')
|
||||
assert_equal "new Effect.Highlight(\"status\",{restorecolor:'#500000', startcolor:'#FEFEFE'});", visual_effect(:highlight, 'status', :restorecolor => '#500000', :startcolor => '#FEFEFE')
|
||||
|
||||
# chop the queue params into a comma separated list
|
||||
beginning, ending = 'new Effect.DropOut("dropme",{queue:{', '}});'
|
||||
ve = [
|
||||
visual_effect(:drop_out, 'dropme', :queue => {:position => "end", :scope => "test", :limit => 2}),
|
||||
visual_effect(:drop_out, 'dropme', :queue => {:scope => :list, :limit => 2}),
|
||||
visual_effect(:drop_out, 'dropme', :queue => {:position => :end, :scope => :test, :limit => 2})
|
||||
].collect { |v| v[beginning.length..-ending.length-1].split(',') }
|
||||
|
||||
assert ve[0].include?("limit:2")
|
||||
assert ve[0].include?("scope:'test'")
|
||||
assert ve[0].include?("position:'end'")
|
||||
|
||||
assert ve[1].include?("limit:2")
|
||||
assert ve[1].include?("scope:'list'")
|
||||
|
||||
assert ve[2].include?("limit:2")
|
||||
assert ve[2].include?("scope:'test'")
|
||||
assert ve[2].include?("position:'end'")
|
||||
end
|
||||
|
||||
def test_toggle_effects
|
||||
assert_equal "Effect.toggle(\"posts\",'appear',{});", visual_effect(:toggle_appear, "posts")
|
||||
assert_equal "Effect.toggle(\"posts\",'slide',{});", visual_effect(:toggle_slide, "posts")
|
||||
assert_equal "Effect.toggle(\"posts\",'blind',{});", visual_effect(:toggle_blind, "posts")
|
||||
assert_equal "Effect.toggle(\"posts\",'appear',{});", visual_effect("toggle_appear", "posts")
|
||||
assert_equal "Effect.toggle(\"posts\",'slide',{});", visual_effect("toggle_slide", "posts")
|
||||
assert_equal "Effect.toggle(\"posts\",'blind',{});", visual_effect("toggle_blind", "posts")
|
||||
end
|
||||
|
||||
|
||||
def test_sortable_element
|
||||
assert_dom_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nSortable.create(\"mylist\", {onUpdate:function(){new Ajax.Request('http://www.example.com/order', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize(\"mylist\")})}})\n//]]>\n</script>),
|
||||
sortable_element("mylist", :url => { :action => "order" })
|
||||
assert_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nSortable.create(\"mylist\", {constraint:'horizontal', onUpdate:function(){new Ajax.Request('http://www.example.com/order', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize(\"mylist\")})}, tag:'div'})\n//]]>\n</script>),
|
||||
sortable_element("mylist", :tag => "div", :constraint => "horizontal", :url => { :action => "order" })
|
||||
assert_dom_equal %|<script type=\"text/javascript\">\n//<![CDATA[\nSortable.create(\"mylist\", {constraint:'horizontal', containment:['list1','list2'], onUpdate:function(){new Ajax.Request('http://www.example.com/order', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize(\"mylist\")})}})\n//]]>\n</script>|,
|
||||
sortable_element("mylist", :containment => ['list1','list2'], :constraint => "horizontal", :url => { :action => "order" })
|
||||
assert_dom_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nSortable.create(\"mylist\", {constraint:'horizontal', containment:'list1', onUpdate:function(){new Ajax.Request('http://www.example.com/order', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize(\"mylist\")})}})\n//]]>\n</script>),
|
||||
sortable_element("mylist", :containment => 'list1', :constraint => "horizontal", :url => { :action => "order" })
|
||||
end
|
||||
|
||||
def test_draggable_element
|
||||
assert_dom_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nnew Draggable(\"product_13\", {})\n//]]>\n</script>),
|
||||
draggable_element("product_13")
|
||||
assert_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nnew Draggable(\"product_13\", {revert:true})\n//]]>\n</script>),
|
||||
draggable_element("product_13", :revert => true)
|
||||
end
|
||||
|
||||
def test_drop_receiving_element
|
||||
assert_dom_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nDroppables.add(\"droptarget1\", {onDrop:function(element){new Ajax.Request('http://www.example.com/', {asynchronous:true, evalScripts:true, parameters:'id=' + encodeURIComponent(element.id)})}})\n//]]>\n</script>),
|
||||
drop_receiving_element("droptarget1")
|
||||
assert_dom_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nDroppables.add(\"droptarget1\", {accept:'products', onDrop:function(element){new Ajax.Request('http://www.example.com/', {asynchronous:true, evalScripts:true, parameters:'id=' + encodeURIComponent(element.id)})}})\n//]]>\n</script>),
|
||||
drop_receiving_element("droptarget1", :accept => 'products')
|
||||
assert_dom_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nDroppables.add(\"droptarget1\", {accept:'products', onDrop:function(element){new Ajax.Updater('infobox', 'http://www.example.com/', {asynchronous:true, evalScripts:true, parameters:'id=' + encodeURIComponent(element.id)})}})\n//]]>\n</script>),
|
||||
drop_receiving_element("droptarget1", :accept => 'products', :update => 'infobox')
|
||||
assert_dom_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nDroppables.add(\"droptarget1\", {accept:['tshirts','mugs'], onDrop:function(element){new Ajax.Updater('infobox', 'http://www.example.com/', {asynchronous:true, evalScripts:true, parameters:'id=' + encodeURIComponent(element.id)})}})\n//]]>\n</script>),
|
||||
drop_receiving_element("droptarget1", :accept => ['tshirts','mugs'], :update => 'infobox')
|
||||
assert_dom_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nDroppables.add("droptarget1", {hoverclass:'dropready', onDrop:function(element){if (confirm('Are you sure?')) { new Ajax.Request('http://www.example.com/update_drop', {asynchronous:true, evalScripts:true, parameters:'id=' + encodeURIComponent(element.id)}); }}})\n//]]>\n</script>),
|
||||
drop_receiving_element('droptarget1', :hoverclass=>'dropready', :url=>{:action=>'update_drop'}, :confirm => 'Are you sure?')
|
||||
|
||||
end
|
||||
def protect_against_forgery?
|
||||
false
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue