变量传递到部分使用路径

ron*_*ory 5 ruby ruby-on-rails partials railstutorial.org

我正在使用本书学习Ruby on Rails .我从这里开始坚持第二次练习.

我的表单部分app/views/users/_form.html.erb看起来像这样:

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

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

  <%= f.label :email %>
  <%= f.email_field :email, class: 'form-control' %>

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

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

  <%= f.submit yield(:button_text), class: "btn btn-primary" %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

我的app/views/users/new.html.erb部分注册视图是这样的:

<% provide(:title, 'Sign up') %>
<% provide(:button_text, 'Create my account') %>
<% provide(:path, signup_path) %>
<h1>Sign Up</h1>
<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= render 'form' %>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

我的编辑视图app/views/users/edit.html.erb是这样的:

<% provide(:title, "Edit user") %>
<% provide(:button_text, "Save changes") %>
<% provide(:url, user_path) %>
<h1>Update your profile</h1>
<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= render 'form' %>
    <div class="gravatar_edit">
      <%= gravatar_for @user %>
      <a href="http://gravatar.com/emails" target="_blank" rel="noopener noreferrer">Change</a>
    </div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

我的问题是我不知道我必须使用提供方法设置编辑视图的哪条路径.

使用signup_path,它可以正常用于注册视图.我为编辑视图尝试的是:

  • user_path (目前在代码示例中)
  • edit_user_path
  • edit_user_path(@user) (传递用户对象)

在我得到的当前路由错误下面:

在此输入图像描述

以下是与用户相关的可用路线:

在此输入图像描述

例如,如果我不使用提供编辑视图来提供网址,它就像这样工作正常:

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

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

  <%= f.label :email %>
  <%= f.email_field :email, class: 'form-control' %>

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

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

  <%= f.submit yield(:button_text), class: "btn btn-primary" %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

但目标是使用partials重构代码,所以我需要为注册视图提供一个url.

routes.rb:

Rails.application.routes.draw do
  get 'sessions/new'

  get 'users/new'

  root 'static_pages#home'
  get    '/help',    to: 'static_pages#help'
  get    '/about',   to: 'static_pages#about'
  get    '/contact', to: 'static_pages#contact'
  get    '/signup',  to: 'users#new'
  post   '/signup',  to: 'users#create'
  get    '/login',   to: 'sessions#new'
  post   '/login',   to: 'sessions#create'
  delete '/logout',  to: 'sessions#destroy'
  resources :users
end
Run Code Online (Sandbox Code Playgroud)

ron*_*ory 4

因此,最后要根据第二个练习的要求传递所需的 url 只需提供user_path. 正如我在问题中提到的,我已经尝试过使用user_path,但我没有看到的是我在部分表单中使用了yield(:path)嵌入网址,因此当您查看我的注册视图问题时,我提供了正确的变量<% provide(:path, signup_path) %>,但在编辑视图中我使用了<% provide(:url, user_path) %>. 因此很明显,即使我设置了正确的路径(如我在尝试中所描述的那样),我也无法从编辑视图提供正确的路径。

因此,对于那些在自己尝试并仔细查看变量分配是否正确后仍陷入该练习的人。这是我的工作解决方案:

形式部分app/views/users/_form.html.erb

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

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

  <%= f.label :email %>
  <%= f.email_field :email, class: 'form-control' %>

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

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

  <%= f.submit yield(:button_text), class: "btn btn-primary" %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

注册视图app/views/users/new.html.erb

<% provide(:title, 'Sign up') %>
<% provide(:button_text, 'Create my account') %>
<% provide(:path, signup_path) %>

<h1>Sign Up</h1>
<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= render 'form' %>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

编辑视图app/views/users/edit.html.erb

<% provide(:title, "Edit user") %>
<% provide(:button_text, "Save changes") %>
<% provide(:path, user_path) %>

<h1>Update your profile</h1>
<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= render 'form' %>
    <div class="gravatar_edit">
      <%= gravatar_for @user %>
      <a href="http://gravatar.com/emails" target="_blank" rel="noopener noreferrer">Change</a>
    </div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)