3

使用 Rails 4,我正在尝试使用 form_for 创建一个对象并将其与用户正确关联。我在“用户”下嵌套了“菜单”资源,因为一个菜单属于一个用户,而一个用户拥有多个菜单。当用户提交新的菜单表单时,我希望保存菜单并将其与用户关联。

你会怎么做?下面的代码有效,因为在控制器的创建方法中,我明确地将新菜单铲到 current_user.menus 中,但感觉就像一个变通方法。我一直在寻找答案,但找不到一个真正的好例子。

谢谢你的帮助。另外,这是我的第一个 StackOverflow 问题,所以也请随时提出如何改进的建议。

路线如下所示:

  resources :users do
    resources :menus, shallow: true   
  end

控制器如下所示:

  def new
    @menu = Menu.new
  end

  def create
    @menu = Menu.new(menu_params)
    current_user.menus << @menu

    if @menu.save
      flash[:notice] = "Menu saved"
    else
      flash[:notice] = "Sorry, menu did not save. Please try again."
    end

    redirect_to user_menus_url
  end

  private

  def menu_params
    params.require(:menu).permit(:name)
  end

视图上的表单如下所示:

<%= form_for @menu, url: user_menus_path(current_user), html: {method: "post", class: "menu_form"} do |f| %>
  <%= f.text_field :name %>
  ...
  <%= f.submit "Create" %>
<% end %>
4

2 回答 2

1

你喜欢这种风格吗?

def create
  flash[:notice] = menu.valid? ? "Menu saved" : "Sorry, menu did not save. Please try again."

  redirect_to user_menus_url
end

private

def menu_params
  params.require(:menu).permit(:name)
end

# this is where the magic happens
def menu
  Menu.where(user_id: current_user.id).create(menu_params)
end
于 2013-10-15T22:06:48.560 回答
0

此表单发送参数如下: {"menu"=>{"name"=>"salads"}, "user_id"=>"1"}

这些似乎是使用正确记录的父对象(用户)自动构建新对象(菜单)的两个最佳选项:

选项 1,与协会一起建设:

  def create
    user = User.find(params[:user_id])
    @menu = user.menus.new(menu_params)

    #....rest of the method...
  end

选项 2,使用 .where,如 mwoods79 所示:

  def create
    @menu = Menu.where(user_id: params[:user_id]).new(menu_params)

    #....rest of the method...
  end
于 2013-10-16T19:22:53.683 回答