简体   繁体   中英

url_for in controller

in a rails 2 controller i get some data from a model

@company = Company.first

and generate the url in the view

<%= url_for @company %>

Of course this works fine. But when i try to use this in a script

include ActionController::UrlWriter
default_url_options[:host] = 'www.example.com'

@company = Company.first
puts url_for(@company)

it fails with

/gems/actionpack-2.3.8/lib/action_controller/url_rewriter.rb:127:in `merge': can't convert Company into Hash (TypeError)

Any ideas?

I think the issue might be that the url_for method that you're used to calling in your views ( and defined on ActionView as a helper ) is not the same url_for method that gets called when you're in a controller.

ActionController::Base has its own, similar (but not the same) method called url_for method. In the scope of your controller, the method defined on ActionController::Base is the one being called. http://apidock.com/rails/ActionController

The link to ActionController docs above technically points to the Rails3 version of the API, but it hasn't really changed. If you absolutely need or want the Rails 2.3 docs, you can download them here .

Those are not the same methods.

In your view, you're calling ActionView::Helpers::UrlHelper#url_for . That method has several checks in it to decide what to do based on the type of data that you passed in. If you pass in a model object you end up in the method ActionController::PolymorphicRoutes#polymorphic_path which figures out which named route it's supposed to be using.

The url_for that you're calling in your script doesn't know how to do any of that. However, it can still do quite a bit and I would suggest that you read the comments in that file for ideas on how to use it. The error message that you got will point you right to it.

/gems/actionpack-2.3.8/lib/action_controller/url_rewriter.rb

(Note: actionpack 2.3.14 is available. You might want to upgrade while you're at it.)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM