JavaScript 这种 JS 的产品分类效果,有什么控件吗?或者实现的原理!

stephen · 2013年02月06日 · 最后由 jasl 回复于 2013年02月07日 · 3576 次阅读

这就是一排链接,点击时传参数进 controller 搜索,你可以看成搜索表单。

@kgen 当点击多个的时候,每一次点击,url 就会改变,如何保存记录 url 呢?

点击的时候获取当前 url

有一个 gems 可以动态生成这类查询,ransack

@ericguo 粗略看了看,感觉很麻烦!

很简单了。。一个 helper 的例子,代码有点乱

def output_cities()
    p = request.query_parameters.to_hash
    p.delete "city"

    html = "<li>"+link_to("全部", providers_path(p), :class => "icon-all #{"cur" if params[:city].blank?}")+"</li>"
    CITIES.each do |k, v|
      html<< "<li>"+link_to(v[0], providers_path(p.merge("city" => k)), :class => "#{v[1]} #{"cur" if params[:city] == k}")+"</li>"
    end
    html.html_safe
  end

#8 楼 @jasl 直接写在模板里就行了。

@Rei 我是因为还有一些计算呵呵,放 helper 里理论性能高点

#10 楼 @jasl 如果你相信 @xdite 的文章,那么就违反了同样是她指出的不要在 helper 里面拼接 html 的原则。

耗时部分可以 cache。

@Rei 我曾经的实现是直接往 output_buffer 里写,这样呢? 如果要是这样不合适的话,那就采用 partial view 的方式了,要不 html 会比较乱

#12 楼 @jasl output_buffer 没研究过。整理为目的的话我用局部模板。

city_helper.rb

def render_cities
  render :partial => "city_options"
end

def render_option_of_total_city(city)
  css_class_name ||= ""
  css_class_name = "cur" if city.blank? 
  link_to("全部", providers_path(p), :class => "icon-al#{css_class_name}")
end

def render_option_of_single_city(k,v,city)
  css_class_name ||= ""
  css_class_name = "cur" if city == k
  link_to(v[0], providers_path(p.merge("city" => k)), :class => "#{v[1]} css_class_name")
end

_city_options.html.erb

<li> <%=  render_option_of_total_city(params[:city]) %> </li>
 <%= content_tag_for(:li, CITIES) do |k,v|%> 
 <li> <%= render_option_of_single_city(k,v, (params[:city]) ) %> </li>
<% end %>

不保證會動...但是我的話,要兼顧維護性和效能我會這樣寫...

  • html 不應該用 helper 拼接
  • 但是可以把邏輯判斷抽出來丟到 helper。
  • 在 ERB 裡呼叫這些 helper,而不是硬湊。
  • 同時不要在 " " 字串裡再作一次邏輯判斷
  • 不要在 helper 裡直接吃 params, 應該用傳值的進去。因為 helper 不應該靠 ask,而是你應該 tell 他。不然很容易爆炸。

@xdite 重写了,thx

需要 登录 后方可回复, 如果你还没有账号请 注册新账号