【发布时间】:2011-03-14 14:23:20
【问题描述】:
我有一个应用程序,它使用一些 Javascript 来处理基本的 Ajax 请求,例如自动完成和实时搜索。例如,我通过以下方式实现了实时搜索;我发现了一些潜在的问题,想和你谈谈,以便有更好的代码。
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
app/views/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/companies.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);
以下是让我怀疑我的代码是否最优的事情:
- 我在
_livesearch_box.html.haml中有Javascript 代码。 - 即使我把它放在
public/javascripts/companies_livesearch.js中,我也必须对其中的#search部分进行硬编码。 - 我在
public/javascripts/companies.js中硬编码了#company_list_container(这是呈现_companies.html.haml的div)。 - 我在
public/javascript/companies.js中硬编码了路径/companies/liveseach?query=。 - 我没有使用 CoffeeScript,主要是因为它希望(至少如果您使用 Barista)在某处(例如在
app/coffeescripts/中)找到纯 JavaScript 代码并在public/javascripts中编译它。但在我的应用程序中,我的app/views/companies中也有一些.js.erb文件;例如,我有一个投票系统,它在 app/views/companies/_vote.js.erb:$("#vote_link_<%= escape_javascript(@company.id.to_s) %>").html("<%= escape_javascript(vote_link_for(@company)) %>")用 Ajax 请求将“投票这家公司”链接替换为“取消投票这家公司”链接(反之亦然),并由控制器中的vote和unvote操作呈现。 我知道有 coffee-haml-filter 可以在 haml 文件中编译 CoffeeScript,但这不是我真正需要的,通常被弃用并被视为脏东西(?)。
所以问题至少是:
- 如何在我的
app/views/*/*.js.*中添加 CoffeeScript? - 我应该有
app/views/*/*.js.*文件吗? - 如何以最有效和最优雅的方式删除所有这些元素 ID 和在 javascript 中硬编码的路径?
抱歉,问题太长了,感谢您结束它!
【问题讨论】:
标签: javascript ruby-on-rails dry unobtrusive-javascript coffeescript