5

我最近将我的一些模板从 ERB 转换为 Haml。大多数情况下它变得更干净更好,但按钮定义开始变得糟糕。

我想转换这个

= link_to t('.new', :default => t("helpers.links.new")),
          new_intern_path,                                       
          :class => 'btn btn-primary' if can? :create, Intern    

像这样

= new_button Intern

除此之外,我还有其他几个实体,Intern因此所有其他页面也将从中受益。

所以,我输入了这段代码

  def new_button(person_class)
    return unless can?(:create, person_class)

    new_route_method = eval("new_#{person_class.name.tableize}_path")

    link_to t('.new', :default => t("helpers.links.new")),
              new_route_method,                                       
              :class => 'btn btn-primary'
  end

它按预期工作。我只是不确定那个eval电话(因为它是邪恶的)。有没有更简单、不那么邪恶的方法?

4

2 回答 2

6

哦,这是一个更好的版本:

def edit_button(person)
  return unless can?(:edit, person)

  link_to t('.edit', :default => t("helpers.links.edit")),
          send("edit_#{person.class.name.singularize.underscore}_path", person),
          :class => 'btn btn-mini'
end
于 2012-06-19T17:16:20.287 回答
1

您可能有兴趣查看PolymorphicRouteshttp://api.rubyonrails.org/classes/ActionDispatch/Routing/PolymorphicRoutes.html#method-i-polymorphic_path)。

有了它,您的代码可能类似于:

def edit_button(person)
  return unless can?(:edit, person)

  link_to t('.edit', :default => t("helpers.links.edit")),
          edit_polymorphic_path(person),
          :class => 'btn btn-mini'
end
于 2017-06-12T21:56:02.890 回答