[Catalyst] Relative links
Andreas Marienborg
omega at palle.net
Thu Nov 10 11:00:41 CET 2005
On 10. nov. 2005, at 09.33, Marcello wrote:
> Bill Moseley ha scritto:
>> Relative links are biting me again, so I'm wondering how others
>> generate links in a sane way.
>> I have an action /admim/things that displays a table of rows. I have
>> some common template code for displaying tables that include column
>> headings that can be clicked on for sorting by that column. For
>> those
>> headings I use relative links so the template code is portable:
>> <th><a href="?o=date">Date</a></th>
>> <th><a href="?o=name">Name</a></th>
>> That works great, in general. Plus, it allows any additional
>> arguments to be included in the links. (e.g. /admin/things/blue
>> might
>> limit to just the blue things, so the sort would be
>> /admin/things/blue?o=date).
>> But that same feature causes trouble when forwarding from another
>> action.
>> An example might be where I re-show the list after deleting an item:
>> package App::C::Admin::Thing;
>> sub delete {
>> my ($self, $c, $id ) = @_;
>> DB::Thing->retrieve($id)->delete;
>> $c->stash->{message} = "Thingy $id was deleted";
>> $c->forward('/admin/things'); # App::C::Admin::things() :
>> Local
>> }
>> Then the relative links on the table end up like this, of course:
>> /admin/thing/delete/234?o=date
>> instead of:
>> /admin/things?o=date
>> I can't use $c->req->action or $c->req->match as that's the action
>> that matched the original request (/admin/thing/delete/234). I
>> suppose I could redirect, but that's very ugly.
>
> But if you don't redirect the user will see /admin/thing/delete/234
> while the page displays a listing of things.
> If she presses the reload button after deleting something, the
> action that gets replayed is not the listing but the deletion,
> probably bringing her to an error page because the item with the
> displayed id doesn't exist anymore (it's just been deleted).
>
> This is my experience and why I redirect after a deletion.
>
> But I agree that redirecting is quite ugly (not to mention slooow).
Another way is of course to use XMLHttpRequest (ajax) for the
deletion, and just display a small throbber that will be hidden on
onSuccess, and display a error in the onError.
I am doing that right now actually, although for autosaving formfields.
andreas
More information about the Catalyst
mailing list