当我创建一本书时,我如何才能 select 我的书所属的类型
how would I be able to select a genre my book is in when I create a book
我不知道如何命名我的问题,对不起哈哈。我正在构建一个应用程序,用户可以在其中注册为作者或审阅者。作者上传属于流派的书籍。作为审阅者的用户按流派查找他们想要审阅的书籍。当我与作者用户一起创建图书资源时,我将如何创建一种方法来选择新图书表单中该图书所属的多个流派?
我正在学习 ruby rails 开发,而且我对它的理解还很早。到目前为止,我已经为我的应用程序设计并使用枚举在用户注册时为他们创建角色,这样他们既可以是作者,也可以是审阅者。我还制作了一个用户控制器,这样当他们注册时,他们就会被重定向到作者资料或评论者资料。下一步是弄清楚如何创建书籍所属的流派。任何的意见都将会有帮助。谢谢
让我们从数据库开始。我们将创建一个 has-and-belongs-to-many 关系,
create_table :books do |t|
t.string :name
t.timestamps
end
create_table :genres do |t|
t.string :name
t.timestamps
end
create_table :books_genres do |t|
t.references :book, foreign_key: true
t.references :genre, foreign_key: true
end
add_index :books_genres, [:book_id, :genre_id], unique: true
现在为模型添加关联:
# app/models/book.rb
class Book < ApplicationRecord
has_and_belongs_to_many :genres
end
# app/models/genres.rb
class Genre < ApplicationRecord
has_and_belongs_to_many :books
end
至于用户界面,我们可以使用标准 HTML Multiple Select,但它确实不友好,所以我们将使用复选框。
# config/routes.rb
resources :books # this is too much, but you will probably use other actions anyway.
# app/controllers/books_controller.rb
def new
@book = Book.new
@genres = Genre.all
end
# app/views/books/new.html.erb
<%= form_with(model: @book, local: true) do |form| %>
<%= form.label :name %>
<%= form.text_field :name %>
<% @genres.each_with_index do |genre, i| %>
<%= check_box_tag "book[genre_ids][#{i}]", genre.id %>
<%= label_tag "book[genre_ids][#{i}]", genre.name %>
<% end %>
<%= form.submit %>
<% end %>
现在我们必须在控制器中做一些魔术,因为我们将接收 genre_ids 作为散列 ({"0" => "1", "1" => "3"}
),这会将其转换为 [1, 3]
# app/controllers/books_controller.rb
def book_params
params[:book][:genre_ids] = (params[:book][:genre_ids] || {}).values.map(&:to_i)
params.require(:book).permit(:name, genre_ids: [])
end
终于可以开始创作书籍了
# app/controllers/book_controller.rb
def create
@book = Book.new(book_params)
if @book.save
redirect_to @book
else
render :new
end
end
要查看任何复选框,您需要在数据库中拥有您的流派。您可以通过 rails console
:
轻松完成此操作
%w[Adventure Tragedy Fantasy].each { |g| Genre.create(name: g) }
复选框可能也不是最好的用户界面,您可能希望 google 用户友好的多选,但这应该向您解释您要实现的目标的基础知识。
我不知道如何命名我的问题,对不起哈哈。我正在构建一个应用程序,用户可以在其中注册为作者或审阅者。作者上传属于流派的书籍。作为审阅者的用户按流派查找他们想要审阅的书籍。当我与作者用户一起创建图书资源时,我将如何创建一种方法来选择新图书表单中该图书所属的多个流派?
我正在学习 ruby rails 开发,而且我对它的理解还很早。到目前为止,我已经为我的应用程序设计并使用枚举在用户注册时为他们创建角色,这样他们既可以是作者,也可以是审阅者。我还制作了一个用户控制器,这样当他们注册时,他们就会被重定向到作者资料或评论者资料。下一步是弄清楚如何创建书籍所属的流派。任何的意见都将会有帮助。谢谢
让我们从数据库开始。我们将创建一个 has-and-belongs-to-many 关系,
create_table :books do |t|
t.string :name
t.timestamps
end
create_table :genres do |t|
t.string :name
t.timestamps
end
create_table :books_genres do |t|
t.references :book, foreign_key: true
t.references :genre, foreign_key: true
end
add_index :books_genres, [:book_id, :genre_id], unique: true
现在为模型添加关联:
# app/models/book.rb
class Book < ApplicationRecord
has_and_belongs_to_many :genres
end
# app/models/genres.rb
class Genre < ApplicationRecord
has_and_belongs_to_many :books
end
至于用户界面,我们可以使用标准 HTML Multiple Select,但它确实不友好,所以我们将使用复选框。
# config/routes.rb
resources :books # this is too much, but you will probably use other actions anyway.
# app/controllers/books_controller.rb
def new
@book = Book.new
@genres = Genre.all
end
# app/views/books/new.html.erb
<%= form_with(model: @book, local: true) do |form| %>
<%= form.label :name %>
<%= form.text_field :name %>
<% @genres.each_with_index do |genre, i| %>
<%= check_box_tag "book[genre_ids][#{i}]", genre.id %>
<%= label_tag "book[genre_ids][#{i}]", genre.name %>
<% end %>
<%= form.submit %>
<% end %>
现在我们必须在控制器中做一些魔术,因为我们将接收 genre_ids 作为散列 ({"0" => "1", "1" => "3"}
),这会将其转换为 [1, 3]
# app/controllers/books_controller.rb
def book_params
params[:book][:genre_ids] = (params[:book][:genre_ids] || {}).values.map(&:to_i)
params.require(:book).permit(:name, genre_ids: [])
end
终于可以开始创作书籍了
# app/controllers/book_controller.rb
def create
@book = Book.new(book_params)
if @book.save
redirect_to @book
else
render :new
end
end
要查看任何复选框,您需要在数据库中拥有您的流派。您可以通过 rails console
:
%w[Adventure Tragedy Fantasy].each { |g| Genre.create(name: g) }
复选框可能也不是最好的用户界面,您可能希望 google 用户友好的多选,但这应该向您解释您要实现的目标的基础知识。