Hartl Rails教程练习2(第10.1.1章)re:部分用于注册和更新表单

时间:2017-05-26 17:29:54

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

Hartl的Rails Tutorial chapter 10.1.1练习2要求干掉新的'和'编辑'通过为用户表单创建部分视图。如练习中所述,较早的行使导致了我需要在部分内容中解决的差异。我希望这将是一个简单的解决方案。这是我的代码:

这是部分形式:

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

将此edit.html.erb这样干掉,使用部分表单工作正常:

<% provide(:title, 'Edit user') %>
<% provide(:button_text, 'Save changes') %>
<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">Change</a>
    </div>
  </div>
</div>

这是我的new.html.erb视图,它应该使表单部分替换表单。差异在表单的开头,form_for的参数包括&#34; @ user&#34; AND&#34; url:signup_path &#34; :

<% provide(:title, 'Sign up') %>
<h1>Sign up</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_for(@user, url: signup_path) do |f| %>
      <%= render 'shared/error_messages' %>

      <%= 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, "Confirmation" %>
      <%= f.password_field :password_confirmation, class: 'form-control' %>

      <%= f.submit "Create my account", class: "btn btn-primary" %>
    <% end %>
  </div>
</div>

然后,改进的DRYed视图应该是这样的,并通过一些调整来处理差异。

<% provide(:title, 'Sign up') %>
<% provide(:button_text, 'Create my account') %>
<h1>Sign up</h1>
<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= render 'form' %>
  </div>
</div>

回到问题:我如何编辑部分表格来处理这种差异?非常感谢阅读和帮助这个铁杆新手!

2 个答案:

答案 0 :(得分:2)

另一种选择是使用new_record?方法。

所以你的form_for看起来像这样:

<%= form_for( @user, url: @user.new_record? ? signup_path : user_update_path %>

Herenew_record?的文档。

我喜欢使用新记录来处理简单的事情,比如在视图中更改按钮文本。这是一个例子:

<%= submit_tag(object.new_record? ? 'Update' : 'Create' , class: 'nice') %>

答案 1 :(得分:1)

一种选择是将local variable传递给部分:

<%= render 'form', url: signup_path %>

然后以形式partial:

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

现在,您可以在每个渲染的基础上为表单传递不同的路径。