2013-01-16 67 views
0

我有Packagebelongs_toShop。在我的应用程序中,用户可以为他们的商店创建包。我有'创建包'工作,但似乎有一个重定向错误,如果我试图保存没有输入任何东西。Rails的form_for重定向嵌套资源错误

# package.rb 
belongs_to :shop 
validates_presence_of :name, :price, :description 

# controller 
def new 
    @shop = current_user.shop 
    @package = Package.new 
end 

def create 
    @package = current_user.shop.packages.build(params[:package]) 
    @package.currency = current_user.shop.currency 
    if @package.save 
    flash[:success] = 'Package added.' 
    redirect_to shop_path(current_user.shop) 
    else 
    render 'new' 
    end 
end 

# routes.rb 
resources :shops, except: [:destroy] do 
    resources :packages 
end 

# new.html.erb 
<%= form_for [@shop, @package] do |f| %> 

这里的错误:

NoMethodError in Packages#create 
undefined method `packages_path' for #<#<Class:0x007fab67191580>:0x007fab634ad7b8> 

Extracted source (around line #6): 
5: 
6: <%= form_for [@shop, @package] do |f| %> 

任何帮助吗?

回答

1

这将是因为@shop是零。该路径是多态的,这意味着它将从两个数组值中生成路径的方法。如果第一个零,它会认为它只是一个包路径。

form_for [@package.shop, @package]会解决它。或者,在路线中,您可以在顶层公开一条路线来处理创建。

resources :packages, :only => :create 

我愿意和第一个选择一样,所以如果出现错误,url看起来与'new'相同。

+0

另一个选项是,在错误的create action中设置@shop实例变量。 – Swards

+0

我会在出错时创建'设置@shop实例变量'。 –