10

パラメータをjavascriptを介してサーバーに渡す必要があります。現時点では、次のようにJavaScriptに渡します。

sendParams("<%= params[:q].to_json %>");

そして、次のように送り返します。

function sendParams(q){
  $.ajax({
    url: '/mymodel/myaction',
    type: 'post',
    data: {'q':q},
    contentType: 'json'
  });
}

私のコントローラーでは、他のパラメーターと同じように使用しようとしています。

MyModel.where(params[:q])

ただし、firebug の [POST] タブに次のように表示されていても、params は空に戻ります。

q=%7B%26quot%3Bc%26quot%3B%3A%7B%26quot%3B0%26quot%3B%3A%7B%26quot%3Ba%26quot%3B%3A%7B%26quot%3B0%26quot%3B%3A%7B%26quot%3Bname%26quot%3B%3A%26quot%3Btitle%26quot%3B%7D%7D%2C%26quot%3Bp%26quot%3B%3A%26quot%3Bcont%26quot%3B%2C%26quot%3Bv%26quot%3B%3A%7B%26quot%3B0%26quot%3B%3A%7B%26quot%3Bvalue%26quot%3B%3A%26quot%3B2%26quot%3B%7D%7D%7D%7D%2C%26quot%3Bs%26quot%3B%3A%7B%26quot%3B0%26quot%3B%3A%7B%26quot%3Bname%26quot%3B%3A%26quot%3Bvotes_popularity%26quot%3B%2C%26quot%3Bdir%26quot%3B%3A%26quot%3Bdesc%26quot%3B%7D%7D%7D

なぜこの情報が where 句で処理されないのか、何か考えはありますか? params Railsを再び読み取り可能にするにはどうすればよいですか?

アップデート:

Started POST "/publications/search?scroll=active&page=6" for 127.0.0.1 at 2013-0
2-12 22:55:24 -0600
Processing by PublicationsController#index as */*
Parameters: {"scroll"=>"active", "page"=>"6"}

更新 2:

問題は明らかにcontentType. それを削除すると、qRails パラメーターとして送信されます。残念ながら、qまだ JSON にあるため、次のエラーが発生します。

undefined method `with_indifferent_access' for #<String:0x686d0a8>

JSON を params ハッシュに変換するにはどうすればよいですか?

4

2 に答える 2

6

これが機能するためには、いくつかの問題を解決する必要がありました。まず、qRails にパラメーターとして送信されていませんでしたが、投稿していました。その理由は、パラメーターとしてではなく、JSON データとして扱われていたためです。次の行を削除してこれを修正しました。

contentType: 'json'

その後、AJAXはちゃんと「q」を送ったのですが、RailsはJSONのままでは使いづらかったです。で解析する必要がありましたが、これはエラーActiveSupport::JSON.decodeをスローしていました。737: unexpected token(JSONlint)[http://jsonlint.com/] でコードを実行したところ、すべての引用符がエスケープされていることがわかりました。

そこから、2つの解決策がありました。明らかなものは、次の.html_safeように使用することでした:

sendParams("<%= params[:q].to_json.html_safe %>");

しかし、これはユーザーが引用符を入力したときに問題を引き起こしました。より安全な代替手段は、エスケープされた HTML エンティティが Rails に戻された後に次のようにデコードすることでした。

ActiveSupport::JSON.decode(CGI.unescapeHTML(params[:q]))

そして、これがうまくいきました。

于 2013-02-13T14:28:13.977 に答える