这可能是一个措辞非常糟糕的问题,但我很好奇 Rails 是如何知道在单击编辑时引入表单数据的。例如,如果我搭建了一个名为 Post 的模型,并为该 Post 输入了标题和内容,稍后当我编辑它时,表单会自动填写。
我查看了控制器和部分表单,但它似乎没有包含任何内容来告诉它用现有数据填充它。
我问这个的原因是因为我想允许用户将其他人的帖子“导入”到他们的表单中并进行编辑。我该怎么做?
这可能是一个措辞非常糟糕的问题,但我很好奇 Rails 是如何知道在单击编辑时引入表单数据的。例如,如果我搭建了一个名为 Post 的模型,并为该 Post 输入了标题和内容,稍后当我编辑它时,表单会自动填写。
我查看了控制器和部分表单,但它似乎没有包含任何内容来告诉它用现有数据填充它。
我问这个的原因是因为我想允许用户将其他人的帖子“导入”到他们的表单中并进行编辑。我该怎么做?
要回答您问题的第一部分,首先查看编辑模型的链接 - 在索引视图文件 ( app/views/posts/index.html.erb
) 中,它将如下所示:
<%= link_to 'Edit', edit_post_path(post) %>
当您在浏览器中打开索引页面时,会生成一个链接,如下所示:
http://*servername*/post/*id*/edit
资源路由知道这调用了 的edit
动作post_controller
,并且id
值在 URL 中。
现在看一下( ) 中的edit
操作- 它看起来像:post_controller
app/controllers/posts_controller.rb
def edit
@post = Post.find(params[:id])
end
所有这一切都是使用id
通过 URL 传递的值Post
在数据库中找到它id
,并将其保存在变量中@post
。如果您查看编辑视图文件 ( app/views/posts/edit.html.erb
) 的代码,它通常只使用部分表单 ( /app/views/posts/_form.html.erb
),并且该文件包含用于呈现您在浏览器中看到的实际表单的代码。
<%= form_for(@post) do |f| %>
@post
此行开始使用在操作中设置的变量构建表单PostsController
edit
。在此代码的块内,您会看到以下内容 -
<div class="field">
<%= f.label :title %>
<%= f.text_field :title %>
</div>
:title
此代码以绑定到属性的形式构建文本字段@post
- 如果该属性中存在值,则该text_field
方法知道使用该值填充文本字段。
第二部分('我希望允许用户将其他人的帖子“导入”到他们的表单中并对其进行编辑')更加开放,并且更多地取决于您在应用程序中实际想要做什么 - 您可以只允许所有用户都可以查看所有其他用户的帖子并直接对其进行编辑(有点像 wiki,但具有破坏性的编辑)。或者您可以使帖子只能由创建它们的用户编辑,但其他人可以查看,然后您可以创建一个控制器操作,允许用户将其他用户帖子的内容复制到当前用户拥有的新帖子中。或其他事情 - 这真的取决于你想要什么。
在编辑的情况下,控制器会获取一个带有您要编辑的项目的 id 的对象。由于 item 是视图可用的实例变量,视图中使用的表单助手生成 HTML,为 HTML 字段提供显示在其中的值。我应该说 Rails Form Helper 的魔力!(好吧,如果您编写纯 HTML,那么它是否像<input value="<%= @post.title %>
“这是 Rails 助手在您使用时自动为您所做的那样简单f.text_field :title
)
导入其他人的帖子是一种业务逻辑,我不确定您的应用程序将如何实现。但是,如果用户单击帖子的编辑链接,那么在填充的视图中,他应该会看到表单中已经填充的现有值。