2009-10-19 3 views
1

Я относительно новичок в рубинах на рельсах, поэтому этот вопрос может быть простым. Rails делает много магии, и я не уверен, где искать такие вещи, потому что я не знаю, какая часть фреймворка виновата.map.resource и соглашение об именах для singleton

Я в основном сделал authlogic_example и прошивал код с последующим кодом. Мой routes.rb выглядит следующим образом

map.root :controller => "user_session", :action => "new" # optional, this just sets the root route 
map.resources :users 
map.resource :user_session 

Как вы можете видеть, у меня есть контроллер с именем user_session. user_session имеет три действия новый, создать и уничтожить. Я могу достигнуть контроллеров на

localhost:3000/user_sessions/[new,destroy,create]. 

Я также могу достигнуть нового действия на

localhost:3000/user_session/new 

для уничтожения или создать я получаю ошибку маршрутизации здесь. Согласно documentation, первый случай должен быть стандартным: «Особое имя присваивается map.resource. Имя контроллера по умолчанию все еще взято из имени множественного числа».

Моя проблема сейчас в том, что link_to только в единственном числе от имени контроллера, где я могу только достигнуть нового, но не уничтожить

<%= link_to "singular", :controller=>"user_session", :action=>"destroy" %> 
#=> http://localhost:3000/user_session/destroy 
<%= link_to "plural", :controller=>"user_sessions", :action=>"destroy" %> 
#=> http://localhost:3000/user_session 

Это довольно запутанным и даже не близко к тому, что я ожидал, но и вызывает проблемы: я не могу

redirect_to :controller=>"user_sessions", :action=>"destroy" 

потому, что я попадаю в

http://localhost:3000/user_session 

Как я уже упоминал, я довольно новичок в рельсах, поэтому у меня может не быть правильного способа мышления. Можете ли вы указать мне на все, что описывает это поведение? Как я могу решить эту проблему?

ответ

2

Поведение, которое вы описываете, верное. По крайней мере, для RESTful routing. Если действие, которое требуется предпринять, связано с типом запроса.

a POST-запрос на http://localhost:3000/user_session создаст сеанс. Хотя запрос DELETE на том же URI уничтожит сеанс.

Если вы просматриваете ресурсы, вы должны использовать удобные методы, чтобы абстрагировать большую часть этого.

Однако map.resources не предоставляет помощника уничтожения. Таким образом, вы должны либо сделать один или явно указать: метод =>: удалить

<%= link_to "Logout", {:controller => "user_sessions", :action => :destroy}, :method => :destroy %> 

Я предпочитаю названный вариант маршрута, когда это идет в конфигурации/маршрутов.гь

map.logout '/logout', :controller => "sessions" , :action => :destroy 

Тогда просто использовать это в своих взглядах:

<%= link_to "Logout", logout_url %> 
+0

Works. Благодарю. ;-) – sebastiangeiger

Смежные вопросы