On Sunday, May 25, 2014 2:31:33 AM UTC-4, Ruby-Forum.com User wrote:
>
> mike2r wrote in post #1146887:
> > I would use resources, as
> > Scott
> > suggests, but limit the actions that you really need such as:
> >
> > resources :dicts, only: [:show]
>
> Now in my case, the action has a "non-standard" name, i.e. ":manage".
>
> Can I use this too in the "only:" array, or should I instead use a
> standard action (in this case probably "edit"), which then, inside my
> controller, invokes the "manage" method?
>
> From my understanding of the "Rails Routing From The Outside" guide,
> routes.rb defines which controller methods are invoked, when a certain
> request arrives, and the "resources" definition just creates standard
> routes with standard action names for the "common case"
> (show/index/edit/....). Did I grasp this correctly?
>
> If I understood this right, I would have two possibilities: Use ab
> action name which reflects the purpose of the action (here: 'manage')
> and write a special route definition, as Евгений Шурмин suggested above,
> or use the standard action names, and use a 'resources' definition. From
> a viewpoint of maintainability, what would you consider the better
> solution?
>
> --
> Posted via http://www.ruby-forum.com/.
To answer your first question, when a segment key is part of your route
(:id) you need to tell rails what you want the named route to look like or
it won't generate one. Even if you didn't have the segment key, for
example:
get 'dict/manage' => 'dict#manage'
it would generate the named routes dict_manage_path and dict_manage_url
which isn't what you want. Therefore, you need the as: :dict to generate
the named route you are after.
In answer to your second question, yes, you have grasped the basics
correctly and yes. The resources statement creates the standard routes as
well as the named routes to go with them. However, it's part of a larger
architecture of handling REST transactions. When you use the following:
rails generate scaffold dict
it will generate not only the routes statement, but the standard actions
and views to go with it. If you stick to the rails convention, it will
save you a lot of time and work, and I advise that you do so unless there
is functionality that just won't work with that structure.
I would argue that from your description (i'm at a little bit of a loss
since I haven't actually seen your controller code), dict is a resource,
even if you don't intend to initially offer users full CRUD options on the
resource. Therefore, I prefer setting this up in the routes (and
elsewhere) as a resource and using standard Rails action names. The word
"manage" to me could be adding a new entry to dict, modifying an existing
entry, etc. This actually involves a number of actions and it would be
better to more specific about the purpose of each action. By the way, edit
actually involves two actions. The first is to provide the user with a
form populated with the values of the existing entry to be edited. The
second happens when the user makes changes and submits the form, and the
resource is updated. In the Rails architecture, these are the edit and
update actions respectively and you would need to allow both in your
resources statement.
If you don't like the Rails standard names for your routes, you can change
them, although I still maintain it's better to learn the Rails way of doing
things and stick to it when possible. This makes maintenance and
integration with other parts of your application much easier. However, in
this case, let's assume we want to say manage instead of edit. You would
route as follows:
resources: :dicts, path_names: { edit: 'manage' }
Note: this changes the path name, so you will have /dicts/:id/manage, but
it doesn't change the controller actions, it will still map to the action
edit in the controller. Usually this is only done when there are specific
reasons to do so, such as creating a site in a different language where you
want the URL's to reflect a language other than English.
--
You received this message because you are subscribed to the Google Groups "Ruby
on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/rubyonrails-talk/2f71e12f-a238-41e1-8c7c-9c9513fd3204%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.