Method: ActionDispatch::Routing::Mapper::Resources#resource
- Defined in:
- actionpack/lib/action_dispatch/routing/mapper.rb
#resource(*resources, &block) ⇒ Object
Sometimes, you have a resource that clients always look up without referencing an ID. A common example, /profile always shows the profile of the currently logged in user. In this case, you can use a singular resource to map /profile (rather than /profile/:id) to the show action:
resource :profile
This creates six different routes in your application, all mapping to the Profiles controller (note that the controller is named after the plural):
GET /profile/new
GET /profile
GET /profile/edit
PATCH/PUT /profile
DELETE /profile
POST /profile
If you want instances of a model to work with this resource via record identification (e.g. in form_with or redirect_to), you will need to call [resolve](CustomUrls#resolve):
resource :profile
resolve('Profile') { [:profile] }
# Enables this to work with singular routes:
form_with(model: @profile) {}
### Options Takes same options as [resources](#resources)
1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 |
# File 'actionpack/lib/action_dispatch/routing/mapper.rb', line 1348 def resource(*resources, &block) = resources..dup if apply_common_behavior_for(:resource, resources, , &block) return self end with_scope_level(:resource) do = :resource, resource_scope(SingletonResource.new(resources.pop, api_only?, @scope[:shallow], )) do yield if block_given? concerns([:concerns]) if [:concerns] new do get :new end if parent_resource.actions.include?(:new) set_member_mappings_for_resource collection do post :create end if parent_resource.actions.include?(:create) end end self end |