2014-02-16 43 views
0

好的我正在向服务器发送JQuery .post请求以插入一些数据。它仅在有时取决于Rails创建方法中的方法。POST方法/创建操作适用于某些方法,但不适用于其他方法,Feedzirra

以下是具体细节。我在前端有一个带Backbone.js的Rails应用程序。在我的前端代码中,我做了这个.post请求

$.post('/publications'); 

看起来很简单。我有一个出版模式以及

resources :publications 

在路由器。现在在我的出版物控制器我增强了创建方法如下:

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提要的瑰宝。当我做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请求工作得很好。我知道'标题'确实是一种方法,因为当我进入Rails控制台并创建一个测试Feedzirra对象并查看可用的各种方法时,我发现'标题'就是其中之一。

为什么我的POST请求对这些方法中的某些方法有效,但对其他方法却不起作用?!?!?!?!

* UPDATE * ***

采取krabbi和亚历山大Zolotko的建议,我开始什么FeedZirra被打回来之后。它看起来像行

feed = Feedzirra::Feed.fetch_and_parse(publication_params[:url]) 

返回一个空的散列。

现在,当我在rails控制台中运行同一行,并在那里硬编码一个url时,它会返回正确的散列值,我可以获取标题和其他值。所以它看起来像问题在于

publication_params[:url] 

就这个问题和开放仍在努力建议:)

* UPDATE第二部分*

我认为问题是,有没有网址发布模型中的列。所以我做了适当的迁移。因此,这里的模式:

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]仍返回零。我也试过行:

params.require(:publication).permit(:url, :name) 

这只是给了我400错误的请求错误

回答

0

由于亚历山大Zolotko指出Feedzirra::Feed.fetch_and_parse似乎返回一个散列。

尝试例如

params = { :name => feed[:title] } 

假设前端是正确的,REST资源出版物中正确设置了Rails中后端。

控制器例如应当是这样的:

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 

我敢肯定,即使工作是不是好的做法。通常你会争取面向对象,在这种情况下,每个动作只有一个目的。

但我现在不知道如何重构提取饲料和可能映射散列。也许这是一个管制员关心或类似的事情。

+0

这并没有导致500错误。它创建了一个新的出版物条目,但名称列中只有nil – user2623706

+0

试着找出你是否需要并允许在params散列表中使用url(假设你使用Rails 4的强参数)。 – krabbi

+0

这就是我所拥有的:'params.permit(:url,:name)' – user2623706

0

审查Feedzirra::Feed.fetch_and_parse我看到的唯一选项后是你的publication_params[:url]包含String以外的东西。在这种情况下,fetch_and_parse返回一个哈希结果(即使只传递了一个url)。你能否检查publication_params[:url].is_a?(String)是否属实。

+0

它返回false。当我对NilClass而不是String进行相同的测试时,它返回true。 – user2623706

相关问题