使用`respond_with`的未定义方法

时间:2013-03-08 00:18:48

标签: ruby-on-rails ruby

编辑:我想知道为什么Ruby / Rails决定在我的控制器中寻找一个名为word_list_url的函数。通常情况下,为什么它在RoR中完成是有道理的,但这对我来说没有意义。

我正在尝试respond_with我的一个控制器函数中的模型对象,如下所示:

def create
   @word_list = WordList.new(params[:word_list])
   @word_list.key = randomKey
   if @word_list.title == nil then @word_list.title = "No Title"
   end
   if @word_list.words == nil then @word_list.words = "Empty"
   end
   @word_list.save
   respond_with @word_list
end

然后我就这样调用API:

curl -v -H "Content-Type: application/json" -X POST -d '{"title":"New Word List", "words":"Words\nFor\nThe\nWord\nList"}' http://localhost:3000/create.json

但是我收到了错误:

NoMethodError (undefined method `word_list_url' for #<WordListsController:0x007fb34c95ca98>):
  app/controllers/word_lists_controller.rb:42:in `create'

然而,这是模型:

class WordList < ActiveRecord::Base
  attr_accessible :key, :title, :words
end

从何处获取“方法word_list_url”?我不完全确定发生了什么。我有respond_to

respond_to :json, :xml

这里发生了什么?如果我使用render代替respond_with,一切正常。


目前,在其他功能中,respond_with工作得很好。例如:

  def show
    lists = WordList.where(:key => params[:id].upcase)
    if lists.length > 0 then @word_list = lists.first
    elsif numberValue(params[:id]).between?(0, WordList.count) then @word_list = WordList.find(params[:id])
    end
    respond_with(@word_list)
  end

路线:

create POST   /create(.:format) word_lists#create
update PUT    /update(.:format) word_lists#update
       GET    /:id(.:format)    word_lists#show

1 个答案:

答案 0 :(得分:1)

如果查看http://api.rubyonrails.org/classes/ActionController/Responder.html,您会看到支持xml格式扩展为

format.xml { render :xml => @word_list, :status => :created, :location => @word_list }

我认为:location使用url_for可能会导致您的错误。尝试

respond_with @word_list do |format|
  format.xml { render :xml => @word_list, :status => :created }
end