0

わかりました、データを挿入するためにサーバーに JQuery .post リクエストを作成しています。Railsのcreateメソッドに含まれるメソッドによっては、時々しか機能しません。

詳細は次のとおりです。フロントエンドに 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 (Internal Server Error) が返され、サーバー ログからこのメッセージが表示されます

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)

私を混乱させているのは、「エントリ」や「nil」などの「タイトル」とは異なる方法を選択した場合です。POST リクエストは正常に機能します。Rails コンソールに移動してテスト用の Feedzirra オブジェクトを作成し、使用可能なさまざまなメソッドを調べると、「title」がその 1 つであることを確認できるため、「title」が実際にメソッドであることはわかっています。

POST リクエストがこれらのメソッドの一部では機能するのに、他のメソッドでは機能しないのはなぜですか?!?!?!?!

*更新* ***

krabbi と Alexander Zolotko のアドバイスを受けて、FeedZirra が返すもので遊んでみました。ラインのようです

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

空のハッシュを返しています。

Railsコンソールで同じ行を実行し、そこにURLをハードコードすると、適切なハッシュが返され、タイトルやその他の値を取得できます. 問題は

publication_params[:url]

まだこれに取り組んでおり、提案を受け付けています:)

* 更新パート 2 *

問題は、パブリケーション モデルに 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 エラーが表示されるだけです

4

2 に答える 2

0

Alexander 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

それが機能したとしても、それは良い習慣ではないと確信しています。通常、あなたはオブジェクト指向をめぐって争います。この場合、行動ごとに 1 つの目的です。

しかし、フィードのフェッチとおそらくハッシュのマッピングをリファクタリングする方法が今のところわかりません。多分それはコントローラーの問題かそのようなものです。

于 2014-02-16T11:49:19.550 に答える