Rails 3.0: ошибка с маршрутами при переопределении to_param в модели - PullRequest
7 голосов
/ 12 февраля 2011

Я получаю сообщение об ошибке с маршрутами, когда пытаюсь переопределить to_param в моей модели пользователя, чтобы использовать адрес электронной почты в качестве идентификатора.Кажется, он пытается сопоставить весь объект для идентификатора, когда он пытается сопоставить маршрут.Может кто-нибудь помочь мне выяснить, чего мне не хватает?

Вот ошибка:

No route matches {:controller=>"users", :action=>"show", :id=>#<User id: 1, email: ....>}

Вот как я настроил код.

модели / пользователь:1017 *

     user GET    /users(.:format)          {:controller=>"users", :action=>"index"}
          POST   /users(.:format)          {:controller=>"users", :action=>"create"}
 new_user GET    /users/new(.:format)      {:controller=>"users", :action=>"new"}
edit_user GET    /users/:id/edit(.:format) {:controller=>"users", :action=>"edit"}
     user GET    /users/:id(.:format)      {:controller=>"users", :action=>"show"}
          PUT    /users/:id(.:format)      {:controller=>"users", :action=>"update"}
          DELETE /users/:id(.:format)      {:controller=>"users", :action=>"destroy"}

Ответы [ 4 ]

5 голосов
/ 12 февраля 2011

Проблема в том, что электронная почта добавляет '.'(точка) в URL, и это сбивает с толку рельсы, потому что он пытается найти формат "com" (если письмо заканчивается на .com)

Я добавил этот код в одно из моих приложений (яесть Люди, а не Пользователи), и это работает правильно, поэтому хитрость заключается в замене точки на что-то еще.Я решил заменить его на «@», так как другие символы, такие как - или +, действительны в адресах электронной почты.

file person.rb

def to_param
  email.sub ".", "@"
end

def self.param_to_email(param) 
  segments = param.split '@'
  host = segments[1..-1].join('.')
  segments[0] + '@' + host
end

file people_controller.rb

def get_person
  email = Person.param_to_email params[:id]
  @person = Person.find_by_email email
end

Есть еще несколько советов о том, как это работает в http://jroller.com/obie/entry/seo_optimization_of_urls_in.

Спасибо за вопрос, я только начинаю с rails,так что это действительно помогает мне понять, как это работает:).

2 голосов
/ 20 сентября 2011

Вы можете включить точки '.'в возвращаемом значении to_param, если вы указали пользовательское регулярное выражение для параметра 'id' в вашем маршруте, например:

match '/images/:id',
  :via => :get,
  :constraints => { :id => /[^\/]+/ },
  :format => false,
  :to => 'images#show',
  :as => :image

См. http://edgeguides.rubyonrails.org/routing.html#specifying-constraints для получения более подробной информации.

0 голосов
/ 27 июля 2013

Чтобы избежать проблем с передачей '.' (dot) через URL-адрес, который вы можете добавить в определение своего маршрута:

resources :users, :id => /.*/

кредитов: https://stackoverflow.com/a/8943634/333061

0 голосов
/ 15 марта 2012

Я столкнулся с проблемами при отправке адреса электронной почты через GET.

#this url will cause the following problem
/resend-validation/abcd@abcd.com 
params[:email] = abcd@abcd

# I had to encode the email:
<%= link_to('Resend Code', resend_activation_path(:email => user.email.unpack('H*'))) %>

# than decode it in controller:
email = params[:email].split.pack('H*')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...