【问题标题】:Using one '_form.html.erb' partial but have different elements appear for certain views使用一个“_form.html.erb”部分,但某些视图会出现不同的元素
【发布时间】:2014-08-27 00:56:48
【问题描述】:

是否可以在 Rails 中的特定视图的部分中显示某些元素?例如,我希望提交按钮的文本根据视图进行更改:因此,如果我在 new.html.erb 中,我希望提交按钮显示为 <%= f.submit 'Create Account' %><%= f.submit 'Update Account' %> 以进行编辑。 html.erb。非常规的方法是手动将自定义代码添加到每个视图中,但是在我的 _form.html.erb 部分中是否有一种聪明的方法可以做到这一点?

【问题讨论】:

    标签: html ruby-on-rails


    【解决方案1】:

    首先,我建议将其放入新视图和编辑视图中。但是,您可以根据需要关闭params[:action]。如

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

    【讨论】:

    • 谢谢。您将这条线放在每个视图中的原因是什么?这不违反 DRY 原则吗?如果我省略了 action 参数,Rails 如何识别它?
    • action 参数由应用程序控制器自动添加到 params 哈希中。我会把它放到每个视图中,因为在我看来这是视图中不必要的逻辑。问题是,这完全是一个意见问题。如果你喜欢它的 _form 部分,请保留它!
    【解决方案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 %>
    

    【讨论】:

      【解决方案3】:

      如果您打算使用单个部分,我会回答 kdeisz 的回答。如果您使用两个单独的视图,则不需要他写的那一行 - 您可以在每个视图的同一个按钮上使用不同的名称,而无需任何条件逻辑。

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

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

      答案不是“仅仅因为”就完全符合 REST 或 DRY,而是问问自己,什么会导致更多的工作。如果您的新页面和编辑页面基本相同,但有一些非常小的功能,则单个部分 (DRY) 更实用。如果您发现它们在未来有显着差异,请将它们分成两个视图(DRY 更少,但变化更大)。

      参数。根据用户请求的路由,向 Rails 发出的每个请求都会自动包含一个动作和一个控制器;例如,导航到/foo/bar 可能会触发控制器foo 的操作bar,具体取决于您设置config/routes.rb 的方式。 Rails 会自动填充params[:action]params[:controller]。可以在here 找到有关其工作原理以及如何访问路径和请求参数的很好解释。

      【讨论】:

      • 感谢您的详尽解释。
      猜你喜欢
      • 2018-10-12
      • 2012-07-17
      • 2021-12-26
      • 1970-01-01
      • 2016-12-27
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      • 2012-10-16
      相关资源
      最近更新 更多