Сначала убедитесь, что вы создали новую запись для пользователя:
class MenusController < ApplicationController
# make sure you authenticate the user first
before_action :authenticate_user!, except: [:show, :index]
def new
@menu = current_user.menus.new
end
def create
@menu = current_user.menus.new(menu_attributes)
# ...
end
end
Затем мы можем просто добавить выбор в форму, где пользователь может выбирать из своих рецептов:
# use form_with in Rails 5.1+
<%= form_for(@menu) do |f| %>
... other fields
<div class="field">
<%= f.label :recipe_ids %>
<%= f.collection_select :recipe_ids, f.object.user.recipies, :id, :name, multiple: true %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
f.object
обращается к экземпляру модели, заключенному в построитель форм.
recipe_ids
- это специальный метод установки / получения, созданный ActiveRecord для ассоциаций has_many
.Как вы можете догадаться, он возвращает массив идентификаторов и позволяет установить связь с массивом идентификаторов - автоматически вставляя / удаляя строки в таблице соединений в процессе.
Затем вам просто нужно внести в белый список параметр recipe_ids
:
def menu_attributes
params.require(:menu)
.permit(:foo, :bar, recipe_ids: [])
end
recipe_ids: []
в белый список разрешенных скалярных типов.Поскольку это опция хеширования, она должна быть указана после любых позиционных аргументов, чтобы быть синтаксически допустимой.
rb(main):003:0> params.require(:menu).permit(:foo, recipe_ids: [], :bar)
SyntaxError: (irb):3: syntax error, unexpected ')', expecting =>