Devise psuje link_to

Korzystam z devise 1.1.5, rails 3.0.3, ruby 1.8.7.

Mam sobie layout application.html.erb o następującej treści:

[code=ruby]

<%= stylesheet_link_tag "style.css" %> -- <%= stylesheet_link_tag :all %> <%= javascript_include_tag :defaults %> <%= csrf_meta_tag %>
<%= link_to "Strona główna" , {:controller => "articles", :action => "show", :id => "10", :title => "Strona główna"}, :class => "header_link", :style => "width: 100px;" %> <%= link_to "Mapa Strony" , {:controller => "articles", :action => "show", :id => "11", :title => "Mapa Strony"}, :class => "header_link", :style => "width: 80px;" %> <%= link_to "Kontakt" , {:controller => "articles", :action => "show", :id => "12", :title => "Kontakt"}, :class => "header_link", :style => "width: 57px; margin: 0;" %>
itd itd[...][/code] rake routes: [code] -- new_user_session GET /users/sign_in(.:format) {:action=>"new", :controller=>"devise/sessions"} user_session POST /users/sign_in(.:format) {:action=>"create", :controller=>"devise/sessions"} destroy_user_session GET /users/sign_out(.:format) {:action=>"destroy", :controller=>"devise/sessions"} user_password POST /users/password(.:format) {:action=>"create", :controller=>"devise/passwords"} new_user_password GET /users/password/new(.:format) {:action=>"new", :controller=>"devise/passwords"} edit_user_password GET /users/password/edit(.:format) {:action=>"edit", :controller=>"devise/passwords"} PUT /users/password(.:format) {:action=>"update", :controller=>"devise/passwords"} user_registration POST /users(.:format) {:action=>"create", :controller=>"devise/registrations"} new_user_registration GET /users/sign_up(.:format) {:action=>"new", :controller=>"devise/registrations"} edit_user_registration GET /users/edit(.:format) {:action=>"edit", :controller=>"devise/registrations"} PUT /users(.:format) {:action=>"update", :controller=>"devise/registrations"} DELETE /users(.:format) {:action=>"destroy", :controller=>"devise/registrations"} user_confirmation POST /users/confirmation(.:format) {:action=>"create", :controller=>"devise/confirmations"} new_user_confirmation GET /users/confirmation/new(.:format) {:action=>"new", :controller=>"devise/confirmations"} GET /users/confirmation(.:format) {:action=>"show", :controller=>"devise/confirmations"} GET /articles/:id(/:title)(.:format) {:action=>"show", :controller=>"articles"} main_find POST /main/find(.:format) {:action=>"find", :controller=>"main"} main_index GET /main/index(.:format) {:action=>"index", :controller=>"main"} GET /main(.:format) {:action=>"index", :controller=>"main"} POST /main(.:format) {:action=>"create", :controller=>"main"} new_main GET /main/new(.:format) {:action=>"new", :controller=>"main"} edit_main GET /main/:id/edit(.:format) {:action=>"edit", :controller=>"main"} main GET /main/:id(.:format) {:action=>"show", :controller=>"main"} PUT /main/:id(.:format) {:action=>"update", :controller=>"main"} DELETE /main/:id(.:format) {:action=>"destroy", :controller=>"main"} root /(.:format) {:action=>"index", :controller=>"main"}[/code] Wszystko śmigało elegancko dopóki nie zainstalowałem devise i wybrałem ręcznie ścieżkę URL http://localhost:3000/users/sign_up

Wówczas otrzymuje taki komunikat o błędzie:

Co ciekawe wywołanie

<%= link_to "Strona główna, root_path %>

działa.

Jak widać devise dorzuca do ścieżki link_to “devise/…”.

Zna ktoś jakiś sposób by poprawnie(zgodnie z konwencją i takie tam :wink: ) naprawić ten problem?
Da się jakoś wywołać link_to dla articles/id/title by nie dopisywał swojego przedrostka?

Z góry dziękuje za odpowiedź.

Edycja:
Czy istnieje jakaś opcja w configu która rozwiązuje mój problem?

ponieważ nadpisuje troche niektóre akcje i chciałem miec kontrolery w osobnym katalogu to mam w konfigu

config.scoped_views = true

a w routes

devise_for :users, :controllers => { :sessions => "users/sessions", :registrations => "users/registrations", :passwords => "users/passwords"} do get 'edit_profile' => 'users/profile#edit' put 'profile' => 'users/profile#update' put 'change_password' => 'users/passwords#change' get 'edit_avatar' => 'users/profile#edit_avatar' put 'avatar' => 'users/profile#update_avatar' delete 'avatar' => 'users/profile#delete_avatar' end

[quote=Artur79]a w routes

devise_for :users, :controllers => { :sessions => "users/sessions", :registrations => "users/registrations", :passwords => "users/passwords"} do get 'edit_profile' => 'users/profile#edit' put 'profile' => 'users/profile#update' put 'change_password' => 'users/passwords#change' get 'edit_avatar' => 'users/profile#edit_avatar' put 'avatar' => 'users/profile#update_avatar' delete 'avatar' => 'users/profile#delete_avatar' end
[/quote]
Mam stworzyć dodatkowy 1 nowy kontroller users
i akcje dla niego: sessions, registrations, passwords, profile, passwords?

w tym przypadku users to jest katalog i w nim sa poszczególne kontrolery, ale używa się tego tylko jeśli chcesz nadpisywać devise’owe akcje

Zrobiłem prosty test.

Wygenerowałem kontroler w app/controller/users_controller.rb
Kod:

class Users::SessionsController < Devise::SessionsController end
rake routes:

-- new_user_session GET /users/sign_in(.:format) {:action=>"new", :controller=>"users/sessions"} user_session POST /users/sign_in(.:format) {:action=>"create", :controller=>"users/sessions"} destroy_user_session GET /users/sign_out(.:format) {:action=>"destroy", :controller=>"users/sessions"} user_password POST /users/password(.:format) {:action=>"create", :controller=>"devise/passwords"} new_user_password GET /users/password/new(.:format) {:action=>"new", :controller=>"devise/passwords"} edit_user_password GET /users/password/edit(.:format) {:action=>"edit", :controller=>"devise/passwords"} PUT /users/password(.:format) {:action=>"update", :controller=>"devise/passwords"} user_registration POST /users(.:format) {:action=>"create", :controller=>"devise/registrations"} new_user_registration GET /users/sign_up(.:format) {:action=>"new", :controller=>"devise/registrations"} edit_user_registration GET /users/edit(.:format) {:action=>"edit", :controller=>"devise/registrations"} PUT /users(.:format) {:action=>"update", :controller=>"devise/registrations"} DELETE /users(.:format) {:action=>"destroy", :controller=>"devise/registrations"} user_confirmation POST /users/confirmation(.:format) {:action=>"create", :controller=>"devise/confirmations"} new_user_confirmation GET /users/confirmation/new(.:format) {:action=>"new", :controller=>"devise/confirmations"} GET /users/confirmation(.:format) {:action=>"show", :controller=>"devise/confirmations"} GET /articles/:id(/:title)(.:format) {:action=>"show", :controller=>"articles"} main_find POST /main/find(.:format) {:action=>"find", :controller=>"main"} main_index GET /main/index(.:format) {:action=>"index", :controller=>"main"} GET /main(.:format) {:action=>"index", :controller=>"main"} POST /main(.:format) {:action=>"create", :controller=>"main"} new_main GET /main/new(.:format) {:action=>"new", :controller=>"main"} edit_main GET /main/:id/edit(.:format) {:action=>"edit", :controller=>"main"} main GET /main/:id(.:format) {:action=>"show", :controller=>"main"} PUT /main/:id(.:format) {:action=>"update", :controller=>"main"} DELETE /main/:id(.:format) {:action=>"destroy", :controller=>"main"} root /(.:format) {:action=>"index", :controller=>"main"}
routes.rb :

   devise_for :users, :controllers => { :sessions => "users/sessions" }

Rezultat:

Jakieś pomysły bądź szczegółowy opis co robię źle poproszę.

Dobra rozkminiłem już poradę Artur79. Dzięki.

Po prostu trzeba wywołać:
rails generate controller users/session
rails generate controller users/registrations
rails generate controller users/passwords
rails generate devise:views users

Dodać to config.scoped_views = true do
app/config/initilizers/devise.rb

Ale wracam do punktu wyjścia(wywołanie users/sign_in:

Teraz zamiast przedrostka “devise/” dał “users/”.

AA nie napisałem z jakiej wersji korzystam. Wyedytuje pierwszy post.

Rozwiązanie:
http://railsforum.com/viewtopic.php?id=41764

<%= link_to("home", url_for('/kontroler')) %>

Albo:

<%= link_to "Home", :controller => "/welcome", :action => "index" %>

Trzeba po prostu dodać slash - “/”.

Problem prawdopodobnie nie występuje w wersjach wyższych.

i własnie dlatego olałem devise