gpt4 book ai didi

ruby-on-rails - 连接路由、 View 和 Controller (Rails)

转载 作者:行者123 更新时间:2023-12-04 18:03:17 26 4
gpt4 key购买 nike

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

Goal:

From the user profile view, link to a form that allows this user to change their email. Once the form is submitted, it should trigger an appropriate method within the 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

用户 Controller

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 为 nil,因为我未能通过它。

非常感谢您解释通过此工作流传递的数据,以便我可以成为更好的开发人员,非常感谢!

编辑:

表单本身:

<%= 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 %>

最佳答案

你可以这样做(注意:id 和“as”):

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) %>

这将调用“UsersController#update”

<%= 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


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

例如,您可以使用#show 和#update 操作将这些映射到显式“资源”...

路线:

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

Controller :

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),因为“资源”会为您生成正确的 url。

...这将是

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

关于ruby-on-rails - 连接路由、 View 和 Controller (Rails),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31576097/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com