2015-10-28 127 views
0

我有一个Rails 4.1.6应用程序,并使用Devise为'用户'模型。我在登录页面的链接工作正常:Rails链接更改另一个链接

<%= link_to 'Sign in'.upcase, new_user_session_path %> 

结果

<a href="https://stackoverflow.com/users/sign_in">SIGN IN</a> 

但是,添加一个链接到另一个控制器上的行动打破了链接sign_in:

<%= link_to('GET STARTED', {controller: :contacts, action: :new}, method: :get) %> 
<%= link_to 'Sign in'.upcase, new_user_session_path %> 

仍生成相同的HTML:

<a data-method="get" href="/contacts/new">GET STARTED</a> 
<a href="https://stackoverflow.com/users/sign_in">SIGN IN</a> 

但是,在“登录”链接不再起作用,与此错误:

ActionController::UrlGenerationError at /users/sign_in 
No route matches {:action=>"new", :controller=>"devise/contacts"} 

This answer是类似的情况,并告诉我说,“Rails正在寻找一个局部设计下作用域,因为这是下一个你正在渲染。“但是,我的范围理解很薄弱,我仍然在努力解决这个问题。

# relevant portion of routes.rb: 
devise_for :users, :controllers => { registrations: 'registrations' } 
resources :users 
match '/contacts/new', to: 'contacts#new', via: 'get' 

回答

0

我不是100%确定为什么会发生这种情况,但我会建议从您的链接中删除method: :get。我还建议使用contacts_new_path帮手,而不是使用{ controller: ..., action: ... }。最后,您可以使用更标准的resource :contacts, only: :new(它将将方法更改为new_contact_path)来定义您的路线。

所以,routes.rb中

resource :contacts, only: :new 

在your_template.html.erb

<%= link_to 'GET STARTED', new_contact_path %> 
<%= link_to 'Sign in'.upcase, new_user_session_path %> 
+0

感谢。是的,使用contacts_new_path帮手解决了这个问题。任何想法为什么我的旧{控制器:...,行动:...}格式导致问题? 另外,感谢您对路线格式的建议,以及它如何影响我的路径帮手 – pgarber

+0

我不确定。使用'{controller:...,action:...}'调用[url_for](http://api.rubyonrails.org/classes/ActionDispatch/Routing/UrlFor.html#method-i-url_for)。也许这加上一些命名空间逻辑正在影响用于你的URL的命名空间。不幸的是,我不够熟悉,无法说清楚。 –