Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在RSpec上表示let helper中的嵌套属性_Ruby On Rails_Ruby_Rspec - Fatal编程技术网

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

Ruby on rails 如何在RSpec上表示let helper中的嵌套属性,ruby-on-rails,ruby,rspec,Ruby On Rails,Ruby,Rspec,我不知道如何表达嵌套属性。 文章有许多文章类别。 我会模拟这种参数 [:article][:article[u categories][0][:category[u id]=40001 我用let来表示这个参数。 下面是我的Rspec代码 let(:article) { { article_categories_attributes:[ category_id: ["40001", "40002"] ] } 但我认为这表达了arti

我不知道如何表达嵌套属性。 文章有许多文章类别。 我会模拟这种参数

[:article][:article[u categories][0][:category[u id]=40001

我用let来表示这个参数。 下面是我的Rspec代码

  let(:article) {
    {
      article_categories_attributes:[
        category_id: ["40001", "40002"]
      ]
     }
但我认为这表达了article[:article\u categories\u attributes][:category\u id]。 如何表示[0]? 如果你能解决这个问题,我将不胜感激

[附录]强_参数

  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
试试这个:

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

希望这能有所帮助:

如果你真正想做的只是将一篇文章和一个你不需要的类别关联起来,那么就接受嵌套的属性

假设您有以下模型:

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为所有has\u many和has\u以及属于\u多个关联创建\u ID设置器。如果关联是间接的,则Rails也会插入联接模型

不必费心尝试使用accepts\u嵌套的\u属性,因为记录还没有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]
       )

你想要达到什么目标?是否要覆盖类别\u id值或读取类别\u id的现有值?什么是:在这种情况下的文章?我觉得您需要在问题中添加更多代码以使其更清晰。谢谢您的评论。我修改了剧本。你能检查一下吗?另外,多行声明使用let with do end。谢谢你的评论。我差点忘了。由于参数太强,它不能正常工作。你能告诉我在这种情况下如何表达嵌套模型吗?我附加了强参数的定义,你是什么意思?两级筑巢?这是一个创建嵌套记录的示例。对不起,可能是这样。当我运行您回答的代码时,调试器显示了article_categories_attributes=>[,],因此,我认为这可能是由强参数定义引起的。在这种情况下,我该怎么办?我决定了。如果您只是希望创建一篇文章,同时为其分配类别,那么您不需要嵌套属性。只需使用类别即可。谢谢,但它不起作用。我错过了我的强参数。我重写了这个问题。你能告诉我怎么做吗?