变量传递到部分使用路径

时间:2016-09-12 07:46:26

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

我使用这个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>

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

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

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

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

enter image description here

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

enter image description here

例如,如果我没有使用“提供”编辑视图来提供网址,则可以正常工作:

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

但目标是使用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

2 个答案:

答案 0 :(得分:4)

因此,最后要将第二个练习here中所需的网址作为要求传递,它只能提供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 %>

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

答案 1 :(得分:0)

你不必申报路径。如果您使用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