如何在RSpec上的let helper中表示嵌套属性

时间:2017-05-24 13:00:29

标签: ruby-on-rails ruby rspec

我无法弄清楚如何表达嵌套属性。 文章有很多ArticleCategory。 我会模拟这种参数。

[:article][:article _categories]["0"][:category _id] = 40001

我用let来表达这个参数。 Belows是我的Rspec代码。

  let(:article) {
    {
      article_categories_attributes:[
        category_id: ["40001", "40002"]
      ]
     }

但我认为这表达了文章[:article_categories_attributes] [:category_id]。 如何表达[“0”]? 如果你能解决这个问题我会很感激。

[appendix] Strong_parameter

  def article_params
    params.require(:article).permit(:id, :current_version , :publish_version, :file, :status, :user_id , :update_user_id, :publish_at, :publish_until, article_categories_attributes: [:article_id, {:category_id => []}], article_tags_attributes: [:article_id, {:tag_id => []}], article_histories_attributes:[:id, :article_id, :version, :title, :content, :comment], articles_article_series_attributes:[:article_id, :series_id, :num])
  end

2 个答案:

答案 0 :(得分:1)

如果您真正想要做的只是关联文章和类别,那么您不需要accepts_nested_attributes

让我们说你有这些模特:

class Article
  has_many :article_categories
  has_many :categories, through: :article_categories
end

class Category
  has_many :article_categories
  has_many :categories, through: :article_categories
end

class ArticleCategory
  belongs_to :article
  belongs_to :category
end

您可以创建文章并将其与类别1,2和3关联:

Article.create(title: 'Hello World', category_ids: [1,2,3]).

在这种情况下,params散列会读取:

let(:params) do   
  {
    article: {
      title: 'Hello World',
      category_ids: [1,2,3]
    }
  }
end

ActiveRecord为所有_idshas_many关联创建has_and_belongs_to_many个设置者。如果关联是间接的,则Rails处理插入连接模型也是如此。

不要试图用accepts_nested_attributes来做这件事 - 因为记录还没有ID,所以在创建记录时它不会起作用。

你也疯狂地筑巢了强大的参数。

不要在一行中写下强大的参数。遵循每行72个字符约定,以便您可以实际读取代码。

params.require(:article)
      .permit(
        :id, :publish_version, :file, :status, :user_id, 
        :update_user_id, :publish_at, :publish_until,
        :categories_ids, :tags_ids,
        article_histories_attributes:
          [:id, :article_id, :version, :title, :content, :comment]
       )

答案 1 :(得分:0)

试试这个:

let(:article) {
{
  article_categories_attributes:
  {
    "0"=>{"category_id"=>"40001"},
    "1"=>{"category_id"=>"40002"}
  }      
 }

希望有所帮助:)