Rails链接更改另一个链接

时间:2015-10-28 21:22:20

标签: ruby-on-rails ruby devise scope

我有一个Rails 4.1.6应用程序并使用Devise用于'用户'模型。我登录页面的链接运行正常:

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

结果

<a href="/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="/users/sign_in">SIGN IN</a>

但是,&#39;登录&#39;链接不再有效,出现此错误:

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

This answer是针对类似情况的,并且告诉我&#39; Rails正在寻找Devise下的部分范围,因为这是您正在渲染的范围。&#39;但是,我的范围理解很弱,我仍然在努力解决这个问题。

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

1 个答案:

答案 0 :(得分: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 %>