Currently these mappings are established somewhere, but I haven’t found it
:get => ‘index’, ‘show’
:post => ‘create’
:delete => ‘destroy’
:put => ‘edit’
In particular I want to add
:options => ‘options’
AJ ONeal
Currently these mappings are established somewhere, but I haven’t found it
:get => ‘index’, ‘show’
:post => ‘create’
:delete => ‘destroy’
:put => ‘edit’
In particular I want to add
:options => ‘options’
AJ ONeal
AJ ONeal wrote:
Currently these mappings are established somewhere, but I haven't found it :get => 'index', 'show' :post => 'create' :delete => 'destroy' :put => 'edit'
In particular I want to add :options => 'options'
No you don't. You probably want :get => 'options'.
Here and in your other post, you're confusing HTTP methods with Rails controller methods. I suggest rereading the routing guide.
AJ ONeal
Best,
> Currently these mappings are established somewhere, but I haven't found > it > :get => 'index', 'show' > :post => 'create' > :delete => 'destroy' > :put => 'edit'
> In particular I want to add > :options => 'options'
No you don't. You probably want :get => 'options'.
Ah, but, I do!
Here and in your other post, you're confusing HTTP methods with Rails controller methods.
Ah, but I'm not
Firefox and Safari / Chrome pre-flight CORS / XHR2 requests with OPTIONS before GET/POST/PUT/DELETE to see if the server allows CORS before attempting the request. Internet Explorer, I believe, just uses the HTTP vars from the original request.
XHR2 Headers such as X-Requested-With X-HTTP-Method-Override Content-Type Accept must be pre-approved with OPTIONS or the request will fail.
AJ ONeal
Firefox and Safari / Chrome pre-flight CORS / XHR2 requests with OPTIONS before GET/POST/PUT/DELETE to see if the server allows CORS before attempting the request. Internet Explorer, I believe, just uses the HTTP vars from the original request.
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
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+