link_to using a hashed :token instead of :id

With Rails 3, how do I create a "link_to" reference that uses a pre- exisiting token value instead of the record id? Is there a way to use the URLHelpers to do this, or do I need to use the old style "link_to" syntax with action, controller, id etc? The documentation doesn't seem to provide any pointers that don't implicitly use :id.

I have a medical database where I'm trying to provide non-trivial references to patient information. I calculate and store a hashed token (:token) in the patient's record. I want to find_by_token(params[:id]), but I need to tell Rails how to create the reference using the :token instead of the :id in the view.

Thanks, Dave

With Rails 3, how do I create a "link_to" reference that uses a pre- exisiting token value instead of the record id? Is there a way to use the URLHelpers to do this, or do I need to use the old style "link_to" syntax with action, controller, id etc? The documentation doesn't seem to provide any pointers that don't implicitly use :id.

I have a medical database where I'm trying to provide non-trivial references to patient information. I calculate and store a hashed token (:token) in the patient's record. I want to find_by_token(params[:id]), but I need to tell Rails how to create the reference using the :token instead of the :id in the view.

In your model...

def to_param   code_to_generate_token end

Once that's done then...

non_trivial_named_path(@model_instance)

will use the result of to_param automatically.

Or, if you don't always want it just do...

non_trivial_named_path(@model_instance.token)

And remember that params[:id] is really the token in that case.

-philip

With Rails 3, how do I create a "link_to" reference that uses a pre- exisiting token value instead of the record id? Is there a way to use the URLHelpers to do this, or do I need to use the old style "link_to" syntax with action, controller, id etc? The documentation doesn't seem to provide any pointers that don't implicitly use :id.

Two ways that I can think of. You can either override the 2 param method, or if you create a route that looks like /foos/:token then the corresponding help will expect you to pass a :token option to it.

Fred