【问题标题】:form_with model parameter for nested resources Rails用于嵌套资源 Rails 的 form_with 模型参数
【发布时间】:2018-12-27 08:26:00
【问题描述】:

您好,我是 Rails(和 Stackoverflow)的新手,请原谅我的问题。

我对“Rails 入门”指南中的 <%= form_with(model: [ @article, @article.comments.build ], local: true) do |form| %> 感到困惑。

  1. guide 提到了[@article, @article.comments.build]“构建嵌套路由”,但它是如何做到的呢?

  2. 正如edgeguides model: @article 中所述,将实际对象@article 传递到表单中。那么我们如何将嵌套路由传递给模型参数呢?

提前感谢您的指导和耐心等待!

更新
经过大量研究,我取得了以下进展

  • buildnew 的别名。
  • [@article, @article.comments.build] 是一个数组
  • 参数model 接受一个类的实例(在本例中为comment),并推断范围(:comment)和url(article_comments_path(@article))。因为传入的实例是新的,所以rails推断方法是postSource

    那么哈希[@article, @article.comments.build]如何返回一个类comment的实例,同时告诉rails正确的URL (article_cmets_path(@article))?

  • 【问题讨论】:

      标签: ruby-on-rails


      【解决方案1】:

      edgeguides中只提供了命名空间路由示例,不作为嵌套路由示例。

      当您传递[@article, @article.comments.build] 时,它会将关联对象comment 的url 视为嵌套路由。

      这是form_with 相对于form_for 的优势

      【讨论】:

      • 创建了 CommentsController#create 的 URL(通过传递 article_id)& 在参数中你将只有 article_id 可以从中获取 @article 对象和 params[:comment] 用于创建 @comment跨度>
      • 嗯,[@article, @article.comments.build] 是否返回 URL 或 comment 类的实例?而如果是前者,那么model如何处理呢?
      • [@article, @article.comments.build] 传递给form_with 你表明它是articlescomments 的嵌套路由并通过article_id 并提交它带有cmets 参数
      • 嗨,雷,感谢您的及时反馈,但我仍在努力理解哈希如何神奇地变成类注释的实例,同时保留 URL。 (我的编辑中的详细信息)
      • 不,它没有使用哈希创建Comment 对象的任何实例,它只是在params 中传递'comment' => { 'name' => 'roy', 'age' => '24' }。所以你必须明确创建@article = Article.find(params[:article_id]); @comment = @article.comments.new(comment_params),其中comment_params是提供白名单评论参数的方法
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-18
      • 1970-01-01
      相关资源
      最近更新 更多