所以我有一个嵌套资源,其中todolist
是父级,todoitem
是子级。
resources :todolists do
resources :todoitems
end
我创建了一个Add Todo List
链接,用于调用new_todolist_todoitem
中的routes.rb
。
new_todolist_todoitem GET /todolists/:todolist_id/todoitems/new(.:format) todoitems#new
在我的todolists/show.html.erb
文件中,我已经包含了这行代码:
<%= link_to 'Add Todo Item', new_todolist_todoitem_path(@todolist.id) %>
在我的todoitems/_form.html.erb
中,我还在其中包含了嵌套参数:
<%= form_for([@todolist, @todoitem]) do |f| %> --> Error is on this line
<% if @todoitem.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@todoitem.errors.count, "error") %> prohibited this todoitem from being saved:</h2>
在我的todoitems_controller.rb
中,我将这些方法放在new
和create
方法中:
# GET /todoitems/new
def new
@todoitem = Todoitem.new
end
# POST /todoitems
# POST /todoitems.json
def create
@todoitem = @todolist.todoitems.new(:todoitem_params)
respond_to do |format|
if @todoitem.save
format.html { redirect_to @todoitem, notice: 'Todoitem was successfully created.' }
format.json { render :show, status: :created, location: @todoitem }
else
format.html { render :new }
format.json { render json: @todoitem.errors, status: :unprocessable_entity }
end
end
end
问题是我一直收到错误声明:
undefined method `todoitems_path' for #<#<Class:0x007feaa79e8da8>:0x007feaa5d0d878>
如果有人有解决此问题或建议的可能解决方案,我们将不胜感激。谢谢!
P.S。根据堆栈跟踪,参数请求为:{"todolist_id"=>"2"}
答案 0 :(得分:1)
您没有在控制器代码中设置@todolist
实例变量,而是在form_for [@todolist, @todoitem]
标记中使用它。确保控制器中有一组。通常它是在before_filter
中完成的,如此:
class Todoitem
before_filter :set_todolist
def set_todolist
@totolist = Todolist.find(params[:todolist_id])
end
end
答案 1 :(得分:0)
有几点值得注意,希望它可以解决您的问题。
在todolists/show.html.erb
中,您只需传递@todolist
link_to
即可
<%= link_to 'Add Todo Item', new_todolist_todoitem_path(@todolist) %>
然后需要对您的控制器进行一些更改:
todoitems_controller.rb
before_action :set_todolist
def create
@todoitem = Todoitem.new(todoitem_params)
# Assuming Todoitem belongs_to Todolist
@todoitem.todolist_id = @todolist.id
...
end
private
def set_todolist
@todolist = Todolist.find(params[:todolist_id]
end
确保你的参数也是正确的。