Ruby on rails 嵌套路由和CRUD操作以及Rails中关联的附加值

Ruby on rails 嵌套路由和CRUD操作以及Rails中关联的附加值,ruby-on-rails,ruby,rails-activerecord,rails-api,nested-routes,Ruby On Rails,Ruby,Rails Activerecord,Rails Api,Nested Routes,我在rails api中创建了一个有很多贯穿关系的应用程序。我还使用嵌套路由 我的模型如下 class Author < ActiveRecord::Base has_many :comments has_many :posts, :through => :comments end class Post < ActiveRecord::Base has_many :comments has_many :authors, :through => :comments

我在rails api中创建了一个有很多贯穿关系的应用程序。我还使用嵌套路由

我的模型如下

class Author < ActiveRecord::Base
 has_many :comments
 has_many :posts, :through => :comments
end

class Post < ActiveRecord::Base
 has_many :comments
 has_many :authors, :through => :comments
end

class Comment < ActiveRecord::Base
 belongs_to :author
 belongs_to :post
end
Rails.application.routes.draw do
 namespace :api, defaults: { :format => 'json' } do
  resources :posts do
   resources :comments
  end
  resources :authors
 end
end
所以我的目标是

  • 注释是嵌套的路由,以便我可以从post创建和显示注释
  • 这里没有任何作者。作者是供评论所有者使用的
  • 我实现了这些概念,几乎所有的工作都在进行中。但我在联想方面面临以下两个问题

  • 如何在创建父表时为关联表添加其他字段。这里我的要求是,当一篇文章被创建时,我需要插入一个默认的评论条目。我创建的post controller实现如下所示
  • def创建
    params=create_params.merge(:record_status=>1)
    @post=post.new(参数)
    @post.authors 1,评论:{record_status:1})
    结束
    私有的
    def取货站
    @post=post.find(参数[:post\u id])
    结束
    结束
    
    这里我在联接表“comments”中找到了作者,但没有正确的注释


    请帮助我解决这些问题

    对于第一个问题,您希望配置
    posts\u控制器
    以接受注释的嵌套属性。在控制器的开头添加此行:

    accepts_nested_attributes_for :comments
    
    有关此方法的详细信息,请查看

    然后,您需要修改控制器将允许的参数:

    def create_params
     params.permit(:name, :description, :author_id, comments_attributes: [ :author_id, :comments, :record_status ] )
    end
    
    修改
    comments\u attributes
    数组中列出的属性,以匹配
    Comment
    模型中的属性

    我不确定你想在第二个问题中得到什么,但也许你只需要换一种方式来查询:

    @comments = Comment.where(post_id: @post.id).includes(:author)
    

    上述操作将返回包括注释作者在内的注释列表。

    对于第一个问题,您希望配置
    posts\u控制器
    以接受注释的嵌套属性。在控制器的开头添加此行:

    accepts_nested_attributes_for :comments
    
    有关此方法的详细信息,请查看

    然后,您需要修改控制器将允许的参数:

    def create_params
     params.permit(:name, :description, :author_id, comments_attributes: [ :author_id, :comments, :record_status ] )
    end
    
    修改
    comments\u attributes
    数组中列出的属性,以匹配
    Comment
    模型中的属性

    我不确定你想在第二个问题中得到什么,但也许你只需要换一种方式来查询:

    @comments = Comment.where(post_id: @post.id).includes(:author)
    

    以上内容将返回包括评论作者在内的评论列表。

    谢谢。我算了算,我明白了。但是一个小小的变化。我不希望在请求中记录\u状态字段值。相反,我需要给出默认值。如何将关联表的记录_状态值合并到参数中。您可以将其从允许的参数中取出。让客户端发布该值,然后服务器将忽略它b/c这不是允许的参数。或者在客户端将属性发布到服务器之前删除该属性。我可以限制客户端的参数。但我需要在控制器中包含这些参数。我的意思是参数需要在内部给出,而不是客户端。在这里,我需要从允许的参数中删除该参数,并需要在控制器中合并。但是合并不起作用,请帮忙我不明白你在做什么。您应该编辑此问题并显示不起作用的代码,或者发布新问题。如果这个答案有帮助的话,那就投票吧。好吧,我结束了这个问题,并为我的问题创建了另一个问题,以避免混淆。谢谢。我算了算,我明白了。但是一个小小的变化。我不希望在请求中记录\u状态字段值。相反,我需要给出默认值。如何将关联表的记录_状态值合并到参数中。您可以将其从允许的参数中取出。让客户端发布该值,然后服务器将忽略它b/c这不是允许的参数。或者在客户端将属性发布到服务器之前删除该属性。我可以限制客户端的参数。但我需要在控制器中包含这些参数。我的意思是参数需要在内部给出,而不是客户端。在这里,我需要从允许的参数中删除该参数,并需要在控制器中合并。但是合并不起作用,请帮忙我不明白你在做什么。您应该编辑此问题并显示不起作用的代码,或者发布新问题。如果这个答案是有帮助的,那么投赞成票也无妨。好吧,我结束了这个问题,并为我的问题创建了另一个问题,以避免混淆。