在Rails应用程序中将记录添加到现有集合

时间:2018-12-06 02:16:40

标签: ruby-on-rails ruby model controller associations

我正在尝试开发一个模型,在该模型中,用户可以将他们正在查看的食谱添加到他们已创建的食谱的现有菜单中,类似于将歌曲添加到自定义播放列表中。我相信我已经正确设置了模型(使用多对多关联关系),但是我不确定如何将实际记录添加到选定的集合中。任何指导都会有所帮助。我的代码如下。

菜单控制器

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

2 个答案:

答案 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 =>