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

问题描述:

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

你会怎么做?下面的代码可以工作,因为在控制器的create方法中,我明确地将新菜单铲入current_user.menus,但感觉就像一个工作。我一直在寻找答案,但一直未能找到一个真正的好例子。

感谢您的任何帮助。此外,这是我的第一个*问题,所以请随时提出建议如何改进。

的路线是这样的:

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 %> 

难道你喜欢这个样式?

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 
+0

The .where works well,thanks。我没有做一个单独的方法“菜单”,如你的例子。相反,在def create中,我将Menu.new行更改为:@menu = Menu.where(user_id:params [:user_id])。new(menu_params) – koanima

+0

你真的不应该这样做。最佳做法是将创建提取到Menu模型或服务对象中。 – mwoods79

这种形式发送的参数,例如: { “菜单”=> { “名称”=> “色拉”}, “USER_ID”=> “1”}

这些似乎是

选项1,与协会建设:自动建立正确记录的新对象(菜单)与父对象(用户)两种最佳选择

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

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

选项2,使用。凡,作为mwo ods79显示:

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

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