好的我正在向服务器发出一个JQuery .post请求以插入一些数据。它有时只能根据Rails创建方法中的方法起作用。
以下是具体细节。我在前端有一个带Backbone.js的Rails应用程序。在我的前端代码中,我创建了.post请求
$.post('/publications');
看起来很简单。我有一个出版物模型以及
resources :publications
在路由器中。现在,在我的Publications控制器中,我将create方法扩展为以下内容:
def create
feed = Feedzirra::Feed.fetch_and_parse(publication_params[:url])
params = {:name => feed.title}
@publication = Publication.new(params)
respond_to do |format|
if @publication.save
format.html { redirect_to @publication, notice: 'Publication was successfully created.' }
format.json { render action: 'show', status: :created, location: @publication }
else
format.html { render action: 'new' }
format.json { render json: @publication.errors, status: :unprocessable_entity }
end
end
end
Feedzirra是一个解析RSS提要的gem。当我发出这样的POST请求时,我得到500(内部服务器错误),并且来自我的服务器日志的消息
NoMethodError (undefined method `title' for {}:Hash):
app/controllers/publications_controller.rb:28:in `create'
Rendered /Users/ericabt1/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/_source.erb (40.3ms)
Rendered /Users/ericabt1/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.1ms)
Rendered /Users/ericabt1/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.0ms)
Rendered /Users/ericabt1/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (54.7ms)
令我感到困惑的是,如果我选择的方法不同于“标题”,例如“条目”或“零”? POST请求工作得很好。我知道'title'确实是一种方法,因为当我进入Rails控制台并创建一个测试Feedzirra对象并查看可用的各种方法时,我发现'title'就是其中之一。
为什么我的POST请求适用于某些方法但不适用于其他方法?!?!?!?!
*更新 * ***
在接受了krabbi和Alexander Zolotko的建议后,我开始玩FeedZirra正在回归。它看起来像
行feed = Feedzirra::Feed.fetch_and_parse(publication_params[:url])
返回一个空哈希。
现在,当我在rails控制台中运行相同的行并在其中硬编码url时,它会返回正确的哈希值,并且我能够获取标题和其他值。所以看起来问题在于
publication_params[:url]
仍然在努力并接受建议:)
*更新第二部分*
我认为问题在于发布模型中没有url列。所以我做了正确的迁移。这是架构:
create_table "publications", force: true do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
t.string "url"
end
回到我底部的控制器:
private
# Use callbacks to share common setup or constraints between actions.
def set_publication
@publication = Publication.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def publication_params
params.permit(:name, :url)
end
publication_params [:url]仍在返回nil。我也试过这条线:
params.require(:publication).permit(:url, :name)
只给了我400 Bad request error
答案 0 :(得分:0)
在查看Feedzirra::Feed.fetch_and_parse
后,我看到的唯一选项是publication_params[:url]
包含除String之外的其他内容。在这种情况下,fetch_and_parse返回结果的哈希值(即使只传递了一个url)。你能否检查publication_params[:url].is_a?(String)
是否属实。
答案 1 :(得分:0)
正如亚历山大·佐洛特科所指出的那样Feedzirra::Feed.fetch_and_parse
似乎会返回一个哈希值。
试试例子
params = { :name => feed[:title] }
假设前端正确并且在Rails后端正确设置了REST资源发布。
控制器应该看起来像:
def create
# requesting the feed from passed url
feed = Feedzirra::Feed.fetch_and_parse(publication_params[:url])
# mapping feed keys to publication attributes
feed_to_publication_hash = { :name => feed[:title], anything else }
# instantiating new publication
@publication = Publication.new(publication_params.merge(feed_to_publication_hash))
...
end
private
def publication_params
params.require(:publication).permit(:url, everything else you need)
end
我很确定即使这样做也不是好习惯。通常你会争取面向对象,在这种情况下,每个动作都有一个目的。
但我现在还不知道如何重构获取feed并可能映射哈希。也许这是一个控制器问题或类似的东西。