请求与路由和操作的关系

时间:2017-03-23 05:52:22

标签: ruby-on-rails

我正在学习Ruby on Rails。我决定在概念上和具体地遵循通过Rails应用程序从客户端到服务器的信息传输,并作为响应返回到客户端。

在我正在关注的信息流中,我点击了“新帖子”链接,该链接通过帖子控制器和新操作进行路由。这就是新行动中的内容:@post = current_user.posts.build。我的想法是,这会在内存(.build)中创建一个对象,其中posts表连接到current_user(来自Devise)。当前用户是来自用户表的数据,该用户表来自模型。此对象已分配给@post变量。

我不是100%清楚current_user和帖子之间的关系,但在我看来帖子包含在current_user中。有没有更好的方法从概念上看到这个??

@post对象与新视图一起发送到客户端。在新视图中是:

<%= simple_form_for @post, html: { class: 'form-horizontal', multipart: true } do |f| %>
<div class="form-group">
  <%= f.input :image %>
</div>
<div class="form-group text-center">
  <%= f.input :caption %>
</div>
<div class="form-group text-center">
  <%= f.button :submit, class: 'btn-success' %>
</div>
<% end %>

我不完全明白这里发生了什么。我认为@post变量插入到此do循环中,并且每个输入都放入图像和标题列中,而信息则放入其他列。这是可能的,因为@post对象包含posts表中的列。我在想这里发生了什么?

现在,使用此对象中的图像和标题,客户端按下提交并启动另一个请求。此请求使用POST方法,因此它将路由到posts控制器和create操作。这是创建操作中的第一行:@post = current_user.posts.build(post_params)

这是我的理解开始分崩离析的地方。我不明白@post对象的图像和标题“内部”如何进入创建动作。路由是否将其直接发送到创建操作中?这就是创造行动没有争论的原因吗?至少我没有,我不知道行动是否可以参与。他们可以吗?

一旦进入创建动作,@post对象内部的图像,标题和其他数据会发生什么?是否被current_user.posts.build(post_params)内的任何内容所取代?实际上current_user.posts.build(post_params)内部是什么? @post对象 - 这是current_user.posts.build - 取代current_user.posts.build(post_params)吗?

发送给build的post_params参数是这个方法:

def post_params
   params.require(:post).permit(:image, :caption)
end

我认为这种方法正在使current_user.posts.build白色列出邮政表中大规模迁移的图片和标题列。

提前感谢任何可以帮助我更清楚地理解这一点的人!

1 个答案:

答案 0 :(得分:1)

current_user和帖子之间的关系, 如果您打开user.rb模型,您将看到has_many关联

has_many :posts

用户有很多帖子,这就是你可以做user.posts.build

的原因
<%= simple_form_for @post, html: { class: 'form-horizontal', multipart: true } do |f| %>

这不是循环。它是一个街区。块类似于回调。 f是@post上的表单构建器对象 f.input(指定正确类型的输入标记):caption是@post上要创建表单的字段

POST方法与您的模型后FYI无关。它是一个HTTP方法,对任何其他模型都保持不变

@post = current_user.posts.build(post_params).

post_params过滤传递的params(表单tdata)并仅允许特定字段。 提交表单时,数据在post键的params中可用     params [:post] [:caption] ...

.build传递参数,这些参数使用输入的数据创建模型的新实例 当你使用.save时,它会将这些数据保存到db