我学习Rails所以请原谅我的业余错误,但我已经被困了大约一两个小时并取得了负面进展。
目标:
从用户
profile
视图,链接到允许此user
的表单 改变他们的电子邮件。表单提交后,应该触发user controller
中的适当方法。
我可以处理剩下的事情,我还没有设法连接上面提到的部分。我一直在阅读railsTutorial.org和guides.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 %>
答案 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| %>