【问题标题】:Variable passing to use path in partial变量传递以部分使用路径
【发布时间】:2017-01-19 14:39:24
【问题描述】:

我正在使用book 学习 Ruby on Rails。 我被困在here 的第二个练习中。

我的表单部分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 %>

我的部分注册视图 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>

而我的编辑视图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>

我的问题是我不知道必须使用 provide 方法为 edit view 设置哪个正确路径。

使用 signup_path 它适用于注册视图。我为编辑视图尝试的是:

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

低于我得到的当前路由错误:

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

例如,如果我不使用提供编辑视图来提供 url,它可以像这里一样正常工作:

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

但目标是使用部分重构代码,所以我需要为注册视图提供一个 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

【问题讨论】:

  • 您能否将routes.rb 中您为用户设置路径的部分发布?
  • 您只需要看一下流程,rails 及其表单如何与活动记录一起使用。请继续使用模型生成脚手架控制器。你会很快学会的。
  • 添加了routes.rb@mrzasa
  • 你在哪里使用edit_user_path(@user)?必须是 get 而不是 patch
  • 我没有使用edit_user_path(@user)。我试过了,但没有用。并且补丁的错误到目前为止一直出现

标签: ruby-on-rails ruby railstutorial.org partials


【解决方案1】:

所以最后传递所需的 url 作为第二个练习 here 的要求,它只提供 user_path。正如我在我的问题中提到的,我已经用user_path 尝试过,但我没有看到的是我以部分yield(:path) 的形式使用了嵌入网址,所以当你查看我的注册视图问题时我使用&lt;% provide(:path, signup_path) %&gt; 提供了变量权,但在编辑视图中我使用了&lt;% provide(:url, user_path) %&gt;。所以很明显,我无法从编辑视图中提供正确的路径,即使我设置了正确的路径,正如您在尝试中所描述的那样。

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

表单部分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 %>

注册视图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>

编辑视图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>

【讨论】:

    【解决方案2】:

    您不必声明路径。如果您使用resources :users。您的应用程序将知道如何设置路径。如果你声明:

    @user = User.new
    

    路径将是:

    new_user_path
    

    但如果你声明:

    @user = User.find(params[:id])
    

    路径将是:

    user_path(id)
    

    http://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/Resources.html

    【讨论】:

    • 我了解我不必使用resources :users 声明路径,但在这种情况下,我需要提供注册视图和编辑视图。所以注册视图需要 url,在本例中为 signup_path。为了提供它,我将它设置为 form_for(@user, '/signup'),并在 _form partial 中使用 signup_path。问题现在正如我在问题中所描述的那样,这是编辑视图的正确路径,或者我如何避免为其设置路径,以便在编辑视图中 form_for 看起来像这样 form_for(@user)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多