我正在尝试开发一个模型,在该模型中,用户可以将他们正在查看的食谱添加到他们已创建的食谱的现有菜单中,类似于将歌曲添加到自定义播放列表中。我相信我已经正确设置了模型(使用多对多关联关系),但是我不确定如何将实际记录添加到选定的集合中。任何指导都会有所帮助。我的代码如下。
菜单控制器
class MenusController < ApplicationController
before_action :set_search
def show
@menu = Menu.find(params[:id])
end
def new
@menu = Menu.new
end
def edit
@menu = Menu.find(params[:id])
end
def create
@menu = current_user.menus.new(menu_params)
if @menu.save
redirect_to @menu
else
render 'new'
end
end
def update
@menu = Menu.find(params[:id])
if @menu.update(menu_params)
redirect_to @menu
else
render 'edit'
end
end
def destroy
@menu = Menu.find(params[:id])
@menu.destroy
redirect_to recipes_path
end
private
def menu_params
params.require(:menu).permit(:title)
end
end
菜单模型
class Menu < ApplicationRecord
belongs_to :user
has_many :menu_recipes
has_many :recipes, through: :menu_recipes
end
menu_recipe模型
class MenuRecipe < ApplicationRecord
belongs_to :menu
belongs_to :recipe
end
食谱模型
class Recipe < ApplicationRecord
belongs_to :user
has_one_attached :cover
has_many :menu_recipes
has_many :menus, through: :menu_recipes
end
用户模型
class User < ApplicationRecord
has_secure_password
has_one_attached :profile_image
has_many :recipes
has_many :menus
end
答案 0 :(得分:2)
您可以执行以下操作:
def add_recipe_to_menu
menu = current_user.menus.find params[:id]
recipe = current_user.recipes.find params[:recipe_id]
menu.recipes << recipe
end
它将在现有配方菜单中添加查看配方。
答案 1 :(得分:0)
首先请确保您是根据用户建立新记录的:
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
关联创建的特殊设置方法。您可能已经猜到它会返回一个ID数组,并使用ID数组来设置关联-在此过程中自动在联接表中插入/删除行。
然后,您只需将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 =>