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>
回到问题:我如何编辑部分表格来处理这种差异?非常感谢阅读和帮助这个铁杆新手!
答案 0 :(得分:2)
另一种选择是使用new_record?
方法。
所以你的form_for
看起来像这样:
<%= form_for( @user, url: @user.new_record? ? signup_path : user_update_path %>
Here是new_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| %>
现在,您可以在每个渲染的基础上为表单传递不同的路径。