> Make sense. Does :options => ''options'' not work at all
or are you just
> getting tired of typing it over and over again ? The former seems
> unlikely, but I haven''t tried. If just the latter then
with_options
> might be of use. You could also try overriding
> map_default_collection_actions on AC::Resources::Resource
>
> Fred
Thanks Fred,
Here''s the monkey patch for Rails 2.3.3. I imagine it should be easy
to modify for other versions:
module ActionController
module Resources
class Resource #:nodoc:
DEFAULT_ACTIONS
= :index, :create, :new, :edit, :show, :update, :destroy, :options
#Options Patch
end
private
def map_member_actions(map, resource)
resource.member_methods.each do |method, actions|
actions.each do |action|
[method].flatten.each do |m|
action_path = resource.options[:path_names][action] if
resource.options[:path_names].is_a?(Hash)
action_path ||= Base.resources_path_names[action] ||
action
map_resource_routes(map, resource, action, "#
{resource.member_path}#{resource.action_separator}#{action_path}", "#
{action}_#{resource.shallow_name_prefix}#{resource.singular}", m,
{ :force_id => true })
end
end
end
route_path = "#{resource.shallow_name_prefix}#
{resource.singular}"
map_resource_routes(map, resource, :show,
resource.member_path, route_path)
map_resource_routes(map, resource, :update,
resource.member_path, route_path)
map_resource_routes(map, resource, :destroy,
resource.member_path, route_path)
map_resource_routes(map, resource, :options, resource.path,
route_path) #Options Patch
end
def action_options_for(action, resource, method = nil,
resource_options = {})
default_options = { :action => action.to_s }
require_id = !resource.kind_of?(SingletonResource)
force_id = resource_options[:force_id] && !resource.kind_of?
(SingletonResource)
case default_options[:action]
when "index", "new";
default_options.merge(add_conditions_for
(resource.conditions, method || :get)).merge(resource.requirements)
when "create";
default_options.merge(add_conditions_for
(resource.conditions, method || :post)).merge(resource.requirements)
when "show", "edit";
default_options.merge(add_conditions_for
(resource.conditions, method || :get)).merge(resource.requirements
(require_id))
when "update";
default_options.merge(add_conditions_for
(resource.conditions, method || :put)).merge(resource.requirements
(require_id))
when "destroy";
default_options.merge(add_conditions_for
(resource.conditions, method || :delete)).merge(resource.requirements
(require_id))
when "options";
default_options.merge(add_conditions_for
(resource.conditions, method || :options)).merge
(resource.requirements) #Options Patch
else default_options.merge(add_conditions_for
(resource.conditions, method)).merge(resource.requirements(force_id))
end
end
end
end
On ubuntu the original file is found at:
/var/lib/gems/1.8/gems/actionpack-2.3.3/lib/action_controller/
resources.rb
And the patch should be placed in your Rails project folder in
./lib/resources.rb
Once installed you can specify options on a per-controller basis like
so:
app/controllers/guest_sessions_controller.rb:
# Create a session for non-logged in users which may be merged on
login or remain anonymous, one-time use.
def create
#TODO how to handle this in the case of internationalization
# I chose not to put this in the db layer because this is shared
with the user class
guest = Guest.new({:display_name=>''Guest''})
guest.save
guest_session = GuestSession.new(guest)
# sanitize the outbound hash now to keep it dry when we add xml
and html support in addition to json
hash = {:display_name => guest.display_name, :single_access_token
=> guest.single_access_token}
respond_to do |format|
# TODO use client ACCEPT headers rather than .:format. That''s
why we have HTTP standards.
format.json { render :json => hash, :callback => params
[:callback] }
end
end
# Log out
def destroy
#TODO if the guest didn''t leave an e-mail, delete the guest
(regarding as spam)
current_guest_session.destroy
message = {:message => "Logout successful!", :errors => []}
respond_to do |format|
format.json { render :json => message, :callback => params
[:callback] }
end
end
# Show HTTP OPTIONS for XHR2 / CORS requests
def options
render :nothing => true, :status => 204
response.headers[''Access-Control-Allow-Origin''] =
''*''
response.headers[''Access-Control-Allow-Methods''] =
''POST, GET,
PUT, DELETE, OPTIONS''
response.headers[''Access-Control-Allow-Credentials''] =
''true''
response.headers[''Access-Control-Max-Age''] =
''86400'' # 24 hours
response.headers[''Access-Control-Allow-Headers''] =
''X-Requested-
With, X-HTTP-Method-Override, Content-Type, Accept''
end
Just to throw out some keyword for my fellow Googlers:
You need this patch for Microsoft Discovery Protocol, WebDAV, DAV,
XHR2, XDR (Cross-Domain Request) and CORS to work with Ruby on Rails
for Firefox 3.5+, Chrome 4+, Safari 4+, and IE8+
--
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en.