RoR5-具有多对多关系的数据库复制

时间:2019-02-13 09:20:50

标签: ruby-on-rails ruby activerecord ruby-on-rails-5

我在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 %>

非常感谢您的帮助

0 个答案:

没有答案