如何使用嵌套资源在Rails 4中创建与用户关联的对象?

时间:2013-10-15 20:47:52

标签: nested ruby-on-rails-4

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

你会怎么做?下面的代码工作,因为在控制器的create方法中我明确地将新菜单拖到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 %>

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

此表单发送参数: {“menu”=&gt; {“name”=&gt;“salads”},“user_id”=&gt;“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