Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.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 在多对多关系中有条件地显示资源-Rails 4_Ruby On Rails_Ruby_Ruby On Rails 4_Many To Many_Strong Parameters - Fatal编程技术网

Ruby on rails 在多对多关系中有条件地显示资源-Rails 4

Ruby on rails 在多对多关系中有条件地显示资源-Rails 4,ruby-on-rails,ruby,ruby-on-rails-4,many-to-many,strong-parameters,Ruby On Rails,Ruby,Ruby On Rails 4,Many To Many,Strong Parameters,正在使用我的第一个Rails应用程序。它将用于搜索和查看特定类别书籍上的数据 两种资源:类别和书籍。我创建了一个多对多HMT(has many-through)关系(如下),因为每个类别都有很多书,而且每本书都属于多个类别。以下是相关控制器代码: 类别模型(Category.rb) 我有一个显示每个类别的show视图。在这个视图中,我想展示每个对应类别中的书籍。我有这些简单的循环: .col-1-3 %strong TITLE %ul - @books.each do |book

正在使用我的第一个Rails应用程序。它将用于搜索和查看特定类别书籍上的数据

两种资源:
类别
书籍
。我创建了一个多对多HMT(has many-through)关系(如下),因为每个类别都有很多书,而且每本书都属于多个类别。以下是相关控制器代码:

类别模型(Category.rb)

我有一个显示每个类别的show视图。在这个视图中,我想展示每个对应类别中的书籍。我有这些简单的循环:

.col-1-3
  %strong TITLE
  %ul
    - @books.each do |book|
      %li= book.title
.col-1-3
    %strong AUTHOR
  %ul 
    - @books.each do |book|
      %li= book.author
.col-1-3
  %strong ULR
  %ul 
    - @books.each do |book|
      %li= book.url
在我的分类模型中,我有以下内容:

def show
  @books = Book.order("title").includes(:categorizations).select("books.*")
end

def book_params
  params.require(:book).permit(:books => [{:title => [:book_id]}, {:id => [:category_id]}, :author, :url] )
end
问题出在这里,从我视图中的循环中,我接收到来自所有书籍的信息(即:数据库中所有书籍的标题、作者和URL),我只希望这些信息来自该特定类别的书籍

我认为我需要更改我的
categories\u controller.rb中的逻辑,是否正确?我意识到我正在选择所有的书籍
。选择(“books.*”
,但我不知道如何编辑它,以便有条件地只调用与
显示
视图中显示的类别相匹配的书籍

感谢你的见解

更新: 意识到这些信息也很有帮助。为书籍指定类别时(在书籍创建时),我使用以下代码:

= check_box_tag "book[category_ids][]", category.id, @book.category_ids.include?(category.id), id: dom_id(category)
也许可以在类别模型中引用
dom\u id(category)


原谅我的“菜鸟”。我是一个前端的家伙,现在才开始真正冒险进入后端

一种可能的解决方案是在这样的类别中更改show action

@图书=类别。查找(参数[:id])。图书

假设:id参数是类别的id(如果您在类别控制器中,这将是惯例)


如果您不需要关于类别的信息,而只需要书籍,那么可以对分类进行联接(而不是包含),并使用where-like分类:{category_-id:params[:id]}。这没有第一个选项那么清楚,但是如果您没有显示有关类别的信息,它会保存一个查询。

如果您在视图中添加一个循环(在第一个
.col-1-3
上方),则只能在视图中使用一个循环。嗯。。。循环位于每个
.col-1-3
列的内部,显示良好。如前所述,问题是我得到的是所有的书籍和它们的数据,而我只想要它们各自类别中的那些。这就是我们手头的问题。当然,这就是为什么要把它添加到评论中而不是答案中。最好使用一个循环而不是三个;)为了性能。啊,明白了:)我误解了你,认为你的意思是“你只能在你的视图中使用一个循环…”完全被误解了。是的,这里一个循环可能比三个好。。。很可能会在以后重构它。工作!非常感谢。此外,我需要显示有关类别和书籍的信息,因此需要包含。
create_table "books", force: true do |t|
  t.string   "title"
  t.string   "url"
  t.integer  "rank_overall"
  t.integer  "rank_category"
  t.decimal  "price"
  t.integer  "reviews"
  t.decimal  "rating"
  t.date     "published"
  t.string   "img_cover"
  t.string   "author"
  t.datetime "created_at"
  t.datetime "updated_at"
  t.string   "asin"
  t.integer  "length"
end

create_table "categories", force: true do |t|
  t.string   "name"
  t.text     "content"
  t.string   "ancestry"
  t.datetime "created_at"
  t.datetime "updated_at"
end

add_index "categories", ["ancestry"], name: "index_categories_on_ancestry", using: :btree

create_table "categorizations", force: true do |t|
  t.integer  "book_id"
  t.integer  "category_id"
  t.integer  "rank"
  t.datetime "created_at"
  t.datetime "updated_at"
end

add_index "categorizations", ["book_id"], name: "index_categorizations_on_book_id", using: :btree
add_index "categorizations", ["category_id"], name: "index_categorizations_on_category_id", using: :btree
.col-1-3
  %strong TITLE
  %ul
    - @books.each do |book|
      %li= book.title
.col-1-3
    %strong AUTHOR
  %ul 
    - @books.each do |book|
      %li= book.author
.col-1-3
  %strong ULR
  %ul 
    - @books.each do |book|
      %li= book.url
def show
  @books = Book.order("title").includes(:categorizations).select("books.*")
end

def book_params
  params.require(:book).permit(:books => [{:title => [:book_id]}, {:id => [:category_id]}, :author, :url] )
end
= check_box_tag "book[category_ids][]", category.id, @book.category_ids.include?(category.id), id: dom_id(category)