连接路线,视图和控制器(Rails)

时间:2015-07-23 00:12:30

标签: ruby-on-rails

我学习Rails所以请原谅我的业余错误,但我已经被困了大约一两个小时并取得了负面进展。

  

目标:

     

从用户profile视图,链接到允许此user的表单   改变他们的电子邮件。表单提交后,应该触发   user controller中的适当方法。

我可以处理剩下的事情,我还没有设法连接上面提到的部分。我一直在阅读railsTutorial.orgguides.rubyonrails.org,但我们无法充分理解routing form_for()

用户个人资料链接:

<%= @user.email %> <%= link_to "(change)", email_path(@user) %>

路线

Rails.application.routes.draw do
  get    'email'    => 'users#email_form'
  post   'email'    => 'users#changeemail'
end

用户控制器

class UsersController < ApplicationController
  def email_form
    @user = User.find(params[:id])
  end

  def changeemail
    @user = User.find(params[:id])
    redirect_to @user
  end
end

目前我点击链接时出现的错误是Couldn't find User with 'id'=,我认为这意味着用户ID为零,因为我无法通过它。

我非常感谢通过此工作流程传递了哪些数据,因此我可以成为更好的开发人员,非常感谢!

编辑:

表单本身:

<%= form_for(@user, url: user_path(@user))  do |f| %>
  <%= render 'shared/error_messages' %>

  <%= f.label :new_email %>
  <%= f.text_field :new_email, class: 'form-control' %>

  <%= f.label :password %>
  <%= f.password_field :password, class: 'form-control' %>

  <%= f.submit "Submit New Email", class: "btn btn-primary" %>
<% end %>

1 个答案:

答案 0 :(得分:0)

你可以这样做(注意:id和&#34; as&#34;):

Rails.application.routes.draw do
  get    'email/:id'    => 'users#email_form', as :email
  post   'email/:id'    => 'users#changeemail', as :change_email
end

然后:id应该是路线的一部分。

或者,在生成url时直接传递id:

<%= @user.email %> <%= link_to "(change)", email_path(id: @user) %>

这将调用&#34; UsersController#update&#34;

<%= form_for(@user, url: user_path(@user))  do |f| %>

...相反,你会使用像::

这样的东西
<%= form_for(@user, url: change_email_path(@user), method: :put)  do |f| %>

http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-form_for

...但就最佳实践而言,如果您想为电子邮件更新单独执行流程,则可以更明确地将其视为不同的资源(即使它仍然是用户记录)。

例如,您可以将这些映射到明确的资源&#39;使用#show和#update动作...

路线:

resources :user_emails, only: [:show, :update]

控制器:

class UserEmailsController < ApplicationController
  def show
    @user = User.find(params[:id])
  end

  def update
    @user = User.find(params[:id])
    redirect_to @user # goes back to UsersController#show
  end
end

然后路线将是:

<%= @user.email %> <%= link_to "(change)", user_email_path(@user) %>

在这种情况下,我们不必说(id:@user),因为&#39;资源&#39;为您生成正确的网址。

......这将是

<%= form_for(@user, url: user_email_path(@user), method: :post)  do |f| %>