使用一个'_form.html.erb'部分,但对于某些视图显示不同的元素

时间:2014-08-26 15:06:09

标签: html ruby-on-rails

是否可以在Rails中的特定视图的部分内显示某些元素?例如,我希望根据视图更改提交按钮的文本:所以,如果我在new.html.erb中,我希望提交按钮显示为<%= f.submit 'Create Account' %>和{{1}用于edit.html.erb。非常规的方法是手动将自定义代码添加到每个视图中,但是在我的_form.html.erb部分中有一种聪明的方法吗?

3 个答案:

答案 0 :(得分:2)

首先,我建议将其放入新视图和编辑视图中。但是,如果您愿意,可以关闭params[:action]。如在

<%= f.submit(((params[:action] == 'new') ? 'Create' : 'Update') + ' Account') %>

答案 1 :(得分:2)

simple_form与i18n一起使用。 SimpleForm会自动生成它。

示例:

  <%= simple_form_for(@message) do |f| %>
    <%= f.error_notification %>
    <%= f.input :title %>
    <%= f.input :description %>
    <%= f.button :submit, class: "btn btn-primary" %>
  <% end %>

答案 2 :(得分:2)

如果您的意图是使用单个部分,我是第二个kdeisz的答案。如果您使用两个单独的视图,则不需要他编写的行 - 您可以在每个视图中的相同按钮上使用不同的名称,而无需条件逻辑。

回答您的补充问题:未来的可变性和DRY代码之间存在权衡。如果您的新编辑需求和编辑需求开始显着不同,那么如果您使用它来渲染主要功能,那么您的部分逻辑中会有很多臃肿,难以更改的条件逻辑。

如果您将视图分开,这可能会重复大量代码,但它也会使各个页面更容易更改;每个视图的功能将根据每个HTTP动词的需要进行定制。

答案不是完全符合REST或干“仅仅因为”,而是要问自己什么会导致更多的工作。如果您的新页面和编辑页面基本相同,但是对于一些非常小的功能,单个部分(DRY)更实用。如果您将来看到它们显着不同,请将它们分成两个视图(较少干,但更多可更改)。

PARAMS。每个对Rails的请求都将根据用户请求的路由自动包含一个动作和一个控制器;例如,导航到/foo/bar可能会触发控制器bar的操作foo,具体取决于您设置config/routes.rb的方式。 Rails会自动填写params[:action]params[:controller]。可以找到有关如何工作以及如何访问路径和请求参数的详细说明here