你可以在视图中使用逻辑吗?导轨

Posted

技术标签:

【中文标题】你可以在视图中使用逻辑吗?导轨【英文标题】:Can you use logic in views? Rails 【发布时间】:2020-08-20 22:40:25 【问题描述】:

我是一名初级开发人员,我已经阅读了很多有关该主题的内容,但没有人非常清楚您是否可以在视图中使用逻辑。

我知道不应该使用复杂的逻辑,但我想知道是否可以使用可以视为与视图相关的逻辑的东西。我说的是这样的事情:

<%=image_tag(group.icon.url, alt: 'Image', class: 'profile-image', id: 'target') if group.icon?%

或者也许可以使用类似的东西。

 <% if logged_in? %>
    <div class="user-avatar d-flex align-items-center flex-column">
        <%=image_tag(current_user.avatar.url, alt: 'Image', class: "avatar-icon") if current_user.avatar?%>
        <h3><%=current_user.name%></h3>
    </div>

    <li class="d-flex menu">
        <div class="icons"><%= image_tag "icons/log_in.svg", alt: "Groups", class: "icons"%></div>
        <div class="d-flex flex-column justify-content-center pl-2">
            <%=link_to "Profile", user_path(current_user), class: "link" %></div>
    </li>
    <li class="d-flex menu">
        <div class="icons"><%= image_tag "icons/time.svg", alt: "Groups", class: "icons"%></div>
        <div class="d-flex flex-column justify-content-center pl-2">
            <%=link_to "My Group Transactions", user_times_path(current_user), class: "link" %></div>
    </li>
<%end%>

这可以使用局部和渲染局部的辅助方法来解决,但在我看来,这会使视图对任何试图理解代码的人来说更加模糊。它还创建了一个新的部分,将只使用一次。此外,如果您的应用中有更多这样的案例,那么您将不得不创建更多的辅助方法和部分。

如果你仔细观察,

<%=image_tag(current_user.avatar.url, alt: 'Image', class: "avatar-icon") if current_user.avatar?%>
<%=image_tag(group.icon.url, alt: 'Image', class: 'profile-image', id: 'target') if group.icon?%

您意识到,这些是相似的方法,但它们并不相同。因此,在这种情况下,很容易创建 2 个辅助方法,或者创建一个允许开发人员通过参数构建所需的 img_tag 的方法,但这两种解决方案似乎都比仅使用内联 if 语句更麻烦。

我想确切地知道在视图上具有与视图相关的逻辑是否被认为是一种好习惯,如果是,是什么类型以及在多大程度上。非常感谢有关该主题的任何资源。

【问题讨论】:

在此处阅读评论主题***.com/questions/63528396/… 虽然不是 ruby​​,但这里的答案实际上是正确表述的...... MVC 应该是语言不可知论者***.com/questions/38284641/… 【参考方案1】:

你能在视图中使用逻辑吗?导轨

是的,你可以。 但你应该避免复杂的逻辑和 ActiveRecord 的东西。 简单的 if-else 就可以了。

谈论使用助手干燥图像标签:

<%=image_tag(current_user.avatar.url, alt: 'Image', class: "avatar-icon") if current_user.avatar?%>
<%=image_tag(group.icon.url, alt: 'Image', class: 'profile-image', id: 'target') if group.icon?%

如果您检查实际上只有一个相似性 alt: 'Image',甚至您可能希望将其更改为其他有意义的 alt 值,例如“头像”或“组图标”。 所以在这个特定的场景中,编写辅助方法并没有增加太多价值。

【讨论】:

以上是关于你可以在视图中使用逻辑吗?导轨的主要内容,如果未能解决你的问题,请参考以下文章

MVC3 视图中的条件逻辑是一个好习惯吗?

视图需要相互依赖的逻辑:没有模型可能吗?

导轨视图中的多组单选按钮

带导轨的图像/照片库(网格视图)?

控制器内部应该写啥逻辑?

当你「ping 一下」的时候,你知道它背后的逻辑吗?