我不知道如何为我的问题加上标题,对不起哈哈。我正在构建一个应用程序,用户可以在其中注册作者或审阅者。作者上载属于体裁的书籍。审阅者可以按类型查找要审阅的书籍。当我与作者用户一起创建图书资源时,如何创建一种以新书形式选择该图书所属的多种流派的方式?
我正在学习关于Rails开发的红宝石,并且对它的理解还很早。到目前为止,我已经为我的应用进行了设计,并且正在使用enum为用户注册时创建角色,以便他们既是作者又是评论者。我还设置了一个用户控制器,以便在他们注册时将其重定向到作者个人资料或审阅者个人资料。下一步是弄清楚如何创建书籍所属的流派。任何的意见都将会有帮助。谢谢
答案 0 :(得分:1)
让我们从数据库开始。我们将创建一个has-and-belongs-to-many关系,
SELECT
min(tblhrsmq_op_task_plot.ddate) as ddate1,
max(tblhrsmq_op_task_plot.ddate) as ddate2,
tblhrsmq_op_task_plot.plot_id,
tbltask_id.hrmqtask_name,
sum(([hr_end]-[hr_begin])*24) AS qty
FROM tbltask_id INNER JOIN tblhrsmq_op_task_plot ON tbltask_id.hmtask_id = tblhrsmq_op_task_plot.hmtask_id
WHERE (((tblhrsmq_op_task_plot.plot_id)=[Formularios]![frm_export]![txtplot]))
group by tblhrsmq_op_task_plot.plot_id,tbltask_id.hrmqtask_name,
;
现在为模型添加关联:
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
对于用户界面,我们可以使用标准的HTML Multiple Select,但是它实际上并不友好,因此我们将使用复选框。
# 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
现在我们必须在控制器中做一些魔术,因为我们将genre_ids作为哈希值(# 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 %>
)接收,这会将其转换为{"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
复选框可能也不是最好的用户界面,您可能想通过Google搜索用户友好的多项选择,但这应该向您解释您要实现的目标的基本知识。