0

私はacts_as_apiを使用しようとしています。彼らのチュートリアルに従ってみましたが、適切な Web ページに移動しても、タイトルのエラーが表示され、画面に何も表示されませんでした。これが私が得たものです:

アプリ/コントローラー/qtls_controller.rb

def show_json
  show_id = URI.decode(params[:id])
  show_id = show_id.gsub(/\s*$/,'')
  @qtls = Qtl.find_by_sql("select * from qtls where qtl_name like '%#{show_id}%' or qtl_symbol in (select qtl_symbol from obs_traits where qtl_symbol like '%#{show_id}%' or trait_name like '%#{show_id}%');")
  respond_to do |format|
    format.json { render_for_api :lis_json, :json => @qtls, :root => :qtls }
  end
end

アプリ/モデル/qtl.rb

 class Qtl < ActiveRecord::Base
   self.primary_key = "qtl_name"
   acts_as_api

   api_accessible :lis_json do |t|
      t.add :qtl_name
      t.add :qtl_symbol
      t.add :qtl_symbol_id
      t.add :qtl_pub_name
      t.add :favorable_allele_source
      t.add :treatment
      t.add :lod
      t.add :marker_r2
      t.add :total_r2
      t.add :additivity
      t.add :map_collection
      t.add :entry_name
      t.add :lg
      t.add :left_end
      t.add :right_end
      t.add :nearest_marker
      t.add :species
      #t.add :trait_name
      t.add :comment
   end
     def species
       'phavu'
     end
     #def trait_name
 #       '' << ObsTrait.find_by_sql("select trait_name from obs_traits where entry_name = '#{entry_name}' and qtl_symbol = '#{qtl_symbol}'")[0].trait_name
  #   end
 end

編集:

Railsコンソールでこれを行うと

@qtls.as_api_response :lis_json, :root => :qtls

それが問題になる可能性がある場合、私はこれを(ルートなしで)idkします:

   => [{:lod=>#<BigDecimal:8063e1cb0,'0.0',9(18)>, :comment=>"Marker-Interval: L040.75–BMd027", :qtl_symbol=>"Pl ht", :entry_name=>"SRK20120130.4", :left_end=>#<BigDecimal:8063e1a08,'0.2964E2',18(18)>, :marker_r2=>#<BigDecimal:8063e1c38,'0.1952E0',9(18)>, :qtl_symbol_id=>"2-2", :right_end=>#<BigDecimal:8063e1990,'0.4503E2',18(18)>, :total_r2=>#<BigDecimal:8063e1bc0,'0.4812E0',9(18)>, :qtl_pub_name=>"Plh1-2", :nearest_marker=>"X010.85", :additivity=>#<BigDecimal:8063e1b48,'0.19E0',9(18)>, :favorable_allele_source=>"G2333", :species=>"phavu", :map_collection=>"G2333_x_G19839", :treatment=>"Darien high phosphorus", :qtl_name=>"Pl ht 2-2", :lg=>"Pv04"}, {:lod=>#<BigDecimal:8063e1800,'0.0',9(18)>, :comment=>"Marker-Interval: BM189–BMd036", :qtl_symbol=>"Pl ht", :entry_name=>"SRK20120130.4", :left_end=>#<BigDecimal:8063e1558,'0.877E1',18(18)>, :marker_r2=>#<BigDecimal:8063e1788,'0.1399E0',9(18)>, :qtl_symbol_id=>"2-1", :right_end=>#<BigDecimal:8063e14e0,'0.1526E2',18(18)>, :total_r2=>#<BigDecimal:8063e1710,'0.5119E0',9(18)>, :qtl_pub_name=>"Plh1-1", :nearest_marker=>"BM189", :additivity=>#<BigDecimal:8063e1698,'0.14E0',9(18)>, :favorable_allele_source=>"G2333", :species=>"phavu", :map_collection=>"G2333_x_G19839", :treatment=>"Popayan", :qtl_name=>"Pl ht 2-1", :lg=>"Pv03"}, {:lod=>#<BigDecimal:8063e1350,'0.0',9(18)>, :comment=>"Marker-Interval: PV-ctt001–BM161", :qtl_symbol=>"Pl ht", :entry_name=>"SRK20120130.4", :left_end=>#<BigDecimal:8063e10a8,'0.8743E2',18(18)>, :marker_r2=>#<BigDecimal:8063e12d8,'0.1403E0',9(18)>, :qtl_symbol_id=>"2-3", :right_end=>#<BigDecimal:8063e1030,'0.9362E2',18(18)>, :total_r2=>#<BigDecimal:8063e1260,'0.5276E0',9(18)>, :qtl_pub_name=>"Plh1-3", :nearest_marker=>"PV-ctt001", :additivity=>#<BigDecimal:8063e11e8,'0.14E0',9(18)>, :favorable_allele_source=>"G2333", :species=>"phavu", :map_collection=>"G2333_x_G19839", :treatment=>"Popayan", :qtl_name=>"Pl ht 2-3", :lg=>"Pv04"}]

これは機能します:

 render :json => @qtls.as_api_response( :lis_json, :root => 'qtls')

しかし、コンソールのようにルートを生成しません...

4

1 に答える 1

1

サーバーが要求している形式を受け入れていないようです。

要求によって、目的の応答形式が決定されていることを確認してください。Railsのデフォルトで、URLposts/1.jsonなどに追加するか、HTTP Accept-Headerとして追加できます。

ログ ファイルをチェックして、アクションがどのように処理されているかを確認してください。次のように表示されます。

Started GET "/qtls/show_json.json" for 127.0.0.1 at 2012-07-23 19:53:11 Processing by QtlsController#show_json as JSON

しかし、私はあなたの場合、次のように言うと思います:

Processing by QtlsController#show_json as HTML

応答形式が指定されていない場合、Rails はデフォルトで HTML を使用します。ただし、レンダリング ブロックでは json 応答のみを許可します。

respond_to do |format|
  format.json { render_for_api :lis_json, :json => @qtls, :root => :qtls }
end

これが、Rails が 406 で応答する理由です。クライアントは HTML (デフォルト形式) を必要としているが、respond_toブロックは json のみを許可していると想定しています。

render :json応答形式を区別しないため、それを機能させるだけの場合は、コントローラーに json で応答するように強制するだけです。

于 2012-07-23T18:10:22.270 に答える