我在RoR方面还很陌生,为了训练自己,我想创建一个小应用程序,在其中可以创建和存储一些活动。对于这些活动,我也有类别,两者之间的关系是多对多的。 我设法在活动创建表单中有一个“类别”字段,但是当我创建一个类别时,该类别未正确映射到表中已存在的类别,但正在创建一个具有相同名称的新类别。
例如,我有一个类别为“ Sport”且ID为“ 1”的类别,我通过表单创建了一个名为“ Running”的新Activity,并在类别字段中设置了“ Sport”。它将在类别表中创建一个条目,但其ID为“ 10”。
主要目标是要有一个字段,我可以在其中开始编写类别名称,并且它将显示具有所有匹配类别名称的补全内容,并且不允许输入不存在的类别,然后链接的类别将是一个已经存储在数据库中。
这是我的代码:
activity.rb
class Activity < ApplicationRecord
has_and_belongs_to_many :categories
accepts_nested_attributes_for :categories,
reject_if: lambda { |attrs| attrs['name'].blank? },
allow_destroy: true
end
category.rb
class Category < ApplicationRecord
has_and_belongs_to_many :activities
end
activities_controller.rb
def new
@activity = Activity.new
@activity.categories.build
end
def create
@activity = Activity.new(activity_params)
redirect_to administration_activities_path
end
def activity_params
params.require(:activity).permit(:name, :active, categories_attributes: [:name])
end
添加活动的表单
<%= form_with(model: @activity) do |f| %>
<div class="field">
<%= f.label :name, "Name" %>
<%= f.text_field :name, autofocus: true %>
</div>
<% if logged_in?(:admin) %>
<div class="field">
<%= f.label :active, "Enabled" %>
<%= f.check_box :active %>
</div>
<% end %>
<%= f.fields_for :categories do |cat| %>
<div class="nested-fields">
<%= f.label :id, "Catégorie" %>
<%= f.text_field :id %>
</div>
<% end %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
非常感谢您的帮助