オートコンプリートやライブ検索などの基本的な Ajax リクエストに Javascript を使用するアプリケーションがあります。たとえば、次の方法でライブ検索を実装しました。潜在的な問題を見つけたので、それについてあなたと話したいので、より良いコードを作りたいと思います.
app/controllers/company_controller.rb
def livesearch
@companies = Company.search(params[:query])
render :partial => "companies", :locals => {:companies => @companies}
end
app/views/companies/_companies.html.haml
- if companies.empty?
None
- else
%table#company_list
%tr
%th Name
%th Description
%th Products
%th
= render companies
アプリ/ビュー/会社/_livesearch_box.html.haml
= content_for :scripts, "jlivesearch companies"
= form_tag "#", :autocomplete => :off, :remote => true do
%span.light
Search:
= text_field_tag :search
:javascript
$('#search').livesearch({
searchCallback: update_listed_companies,
queryDelay: 200,
innerText: "Search companies"
});
public/javascripts/company.js
function update_listed_companies(query) {
if(typeof query == "undefined")
query = "";
$("#company_list_container").showWith(
"/companies/livesearch?query=" + query,
false
);
}
public/javascripts/application.js
(function($) {
$.fn.showWith = function (what, popup) {
element = this;
$.get(what, function(data) {
element.html(data);
if(popup)
element.bPopup();
});
return element;
};
})(jQuery);
私のコードの最適性について疑わしい点は次のとおりです。
- に Javascript コードがあり
_livesearch_box.html.haml
ます。 - に入れても、その部分
public/javascripts/companies_livesearch.js
をハードコーディングする必要があります。#search
- 私は(レンダリングされる
#company_list_container
divです)にハードコーディングしています。_companies.html.haml
public/javascripts/companies.js
/companies/liveseach?query=
にハードコードされたパスがありますpublic/javascript/companies.js
。- 私はCoffeeScriptを使用していません。主な理由は、(少なくともBaristaを使用している場合)純粋なjavascriptコードをどこか(たとえば.
app/coffeescripts/
)で見つけてpublic/javascripts
. しかし、私のアプリケーションでは、私の中にいくつかの.js.erb
ファイルもありますapp/views/companies
。たとえば、私は app/views/companies/_vote.js.erb$("#vote_link_<%= escape_javascript(@company.id.to_s) %>").html("<%= escape_javascript(vote_link_for(@company)) %>")
で次を使用する投票システムを持っています: Ajax リクエストであり、コントローラーのvote
およびunvote
アクションによってレンダリングされます。Hamlファイル内でCoffeeScriptをコンパイルするcoffee-haml-filterがあることは知っていますが、それは私が正確に必要としているものではなく、通常は推奨されておらず、汚いもの(?)と見なされています。
したがって、質問は少なくとも次のとおりです。
- 私の中にCoffeeScriptを入れる方法は
app/views/*/*.js.*
? app/views/*/*.js.*
ファイルを持っている必要がありますか?- 最も効率的かつエレガントな方法で、JavaScript にハードコーディングされたすべての要素 ID とパスを削除するにはどうすればよいですか?
長い質問で申し訳ありませんが、最後までお付き合いいただきありがとうございます。