如何在“wishlist_entry”的“wishlist_id”字段中保存新心愿单的id?

时间:2012-02-10 17:17:12

标签: ruby-on-rails ruby database ruby-on-rails-3

我想将wishlist的ID保存在wishlist_entry列中的wishlist_id表中。 我有一个像这样的link_to元素:

<%= link_to 'Create', new_wishlist_entry_path(:wishlist => @wishlist.id) %> 

这给了我以下网址:

http://localhost:3000/wishlist_entries/new?wishlist=36

wishlist_entry_controller的new操作是:

def new
  @wishlist_entry = WishlistEntry.new
  @wishlist = Wishlist.find(params[:wishlist])
  respond_to do |format|
    format.html # new.html.erb
    format.json { render json: @wishlist_entry }
  end
end

创建操作是:

def create
@wishlist_entry = WishlistEntry.new(
  :wishlist_id => Wishlist.find(params[:id]),
  :entry_name => params[:wishlist_entry][:entry_name],
  :description => params[wishlist_entry][:description]
)

我收到此错误:

Couldn't find Wishlist without an ID
app/controllers/wishlist_entries_controller.rb:44:in `create'

错误在链接中:

:wishlist_id => Wishlist.find(params[:id]),

什么错了?如何在wishlist_id的{​​{1}}字段中保存新愿望清单的ID?

2 个答案:

答案 0 :(得分:1)

我认为问题是愿望清单ID是在params [:wishlist]而不是params [:id]。您在控制器中看到的错误是因为params [:id]为nil且Wishlist类不知道如何处理Wishlist.find(nil)。

试试这个:

def create
  @wishlist_entry = WishlistEntry.new(
    :wishlist_id => params[:wishlist]),
    :entry_name => params[:wishlist_entry][:entry_name],
    :description => params[wishlist_entry][:description]
  )

答案 1 :(得分:0)

如果不确切知道你在这里尝试做什么,看起来问题是wishlist_id没有传递给你的创建动作。

解决此问题的最佳方法是利用您已通过更改

设置的嵌套资源
<%= link_to 'Create', new_wishlist_entry_path(:wishlist => @wishlist.id) %>

<%= link_to 'Create', new_wishlist_wishlist_entry_path(:wishlist => @wishlist.id) %>

wishlist_wishlist_entry看起来很糟糕,但您可以使用:as => 'whatever' in your routes更改

然后在你的新动作中:

@wishlist = Wishlist.find(params[:wishlist_id])

以您的形式:

form_for([@wishlist, @wishlist_entry])

在你的创作中:

@wishlist = Wishlist.find(params[:wishlist_id])
@wishlist_entry = @wishlist.wishlist_entries.build(params[:wishlist_entry])