Rails嵌套资源(新)

时间:2016-04-12 02:14:24

标签: ruby-on-rails ruby

所以我有一个嵌套资源,其中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中,我将这些方法放在newcreate方法中:

  # 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"}

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

确保你的参数也是正确的。