2017-05-18 67 views
0

在此Rails應用程序中,用戶可以編寫故事並將其添加到集合。在他們編寫故事時,用戶可以將其添加到現有的集合中,或者通過模式在story/new.html.erb視圖中創建一個新的集合。更改爲嵌套資源後表格被破壞

它看起來像這樣目前

的routes.rb

resources :users 
resources :collections 

new.html.erb

<%= form_for Collection.new do |f| %> 

收藏控制器

class CollectionsController < ApplicationController 

def new 
    @user = current_user # or however 
    @collection = Collection.new 
end 

    def show 
    @collection = Collection.friendly.find(params[:id]) 
    end 

    def create 
    @collection = current_user.collections.build(collection_params) 
    if @collection.save 
     render json: @collection 
    else 
     render json: {errors: @collection.errors.full_messages} 
    end 
    end 

    private 

    def collection_params 
    params.require(:collection).permit(:name, :description) 
    end 
end 

故事控制器

class StoriesController < ApplicationController 
    def new 
    @story = Story.new 
    authorize @story 
    end 
end 

現在我要嵌套的路線,使得藏品屬於用戶本身

resources :users do 
    resources :collections 

然而,導致在這條線

<%= form_for Collection.new do |f| %> 

,它不再起作用錯誤。如何解決這個問題?謝謝。

回答

0

嵌套的資源後,收集路線改變

如果早路線是

/collections/24 

現在變成

/users/1/collections/24 

所以,你必須改變的form_for方法。您需要添加資源的嵌套與在這種情況下應該是

<%= form_for [@user,@collection] do |f| %> 
    #your code here 
<% end %> 

你也需要協會加入到這兩種模式,即用戶has_many :collections和收集belongs_to :user

在你的控制,首先用戶必須被實例化,然後將創建集合:

@user = current_user #The parameter can be named anything 
@collection = Collection.new 
0

你需要告訴你關於新的路由模式的表單對象。

也不要直接將Model.new寫入您的表單。

當嵌套這樣的路由時,我們對用戶和集合進行了假設,即用戶已經存在。

您應該在您的new操作中實例化您的資源(現有用戶和新集合)。

def new 
    @user = User.find(params[:user_id]) # since nested 
    @collection = Collection.new 
end 

<% form_for [@user, @collection] do |f| %> 
<% end %> 
+0

感謝您的支持。我仍然收到此錯誤「表單中的第一個參數不能包含零或爲空」,用於行<%= form_for [@user,@collection] do | f | %> – Joshua

+0

您需要確保'@ user'和'@ collection'都已定義 – fbelanger

+0

在這種情況下,我應該在哪裏定義它們?就我所知,我已經在控制器中這樣做了。謝謝。 – Joshua