0

如果我们在 Rails 中创建默认的脚手架,则两者的edit.html.erb内部new.html.erb渲染相同_form.html.erb。两者都创建具有某些相似之处和不同之处的形式。

如:

  • 两者都创建<form method="post" ...>
  • 提交按钮有不同的文本<input value='Create model' ..<input value='New model' ..

我的问题:

  1. 条件渲染是如何工作的?
  2. 如何有条件地显示表单元素?例如, <input>仅当它被 via 调用时才edit.html.erb显示它,但如果被调用 via 则不显示它new.html.erb
  3. 如果 q.2 中的方法可能,它是正确的方法吗?我们正在重用代码而不是重新复制表单,不是吗?
4

2 回答 2

1

假设您遵循 RESTful 约定,您看到的 edit 和 new 之间的差异基于您传递给表单的对象的状态。#new_record?Rails 可以通过使用该方法来区分新对象和已持久化对象之间的区别。

Model.new.new_record? # => true
Model.first.new_record? # => false

在您的#new控制器操作中,您可能有以下内容:

@model = Model.new

在你的#edit行动中,你可能有这样的事情:

@model = Mode.find(params[:id])

然后将该@model对象传递给表单,该表单在内部处理条件逻辑。您应该注意到的表单的另一个区别是该#edit版本有一个隐藏的输入字段,告诉服务器使用PUTHTTP 方法。

更新

看起来 Rails 实际上使用了持久化?内部方法而不是 new_record?。区别就在于坚持?检查记录是否已被删除。否则,它们是相同的(但相反)

于 2012-08-23T01:14:11.227 回答
0

你可以这样做:

在 new.html.erb 中: <%= render :partial =>'form', :locals => {:action => 'new', :f => f } %>

在 edit.html.erb 中: <%= render :partial =>'form', :locals => {:action => 'edit', :f => f } %>

在 _form.html.erb: if action == 'new'if action == 'edit'

您也可以发送其他参数,:locals例如:show_mobile => false.

于 2012-08-23T00:53:14.387 回答