如何重构条件语句?

时间:2014-01-03 17:08:07

标签: ruby-on-rails devise

我正在使用Rails 4而我正在使用设计进行用户管理。我在这样的show视图中有一个简单的条件语句

<% if user_signed_in? %>
    <%= link_to "Checkout", user_cart_path(current_user,@cart), method: :patch %>
<% else %>
    <%= link_to "Checkout", signin_path %>
<% end %>

我想清理我的视图并添加条件方法。

我尝试添加方法

def checkout_link(current_user)
    if user_signed_in?
        link_to "Checkout", user_cart_path(current_user, self), method: :patch
    else 
        link_to "Checkout", signin_path
    end
end

到我的购物车模型,并将我的show cart视图中的条件替换为

<%= @cart.checkout_link(current_user) %>

当我加载购物车展示页面时,我收到错误

undefined method `user_signed_in?' for #<Cart:0x007fd015525228>

我做错了什么? 感谢。

3 个答案:

答案 0 :(得分:2)

你做错的事情是关于你的模型与视图。这不应该这样做。

您应该将checkout_link放在视图助手方法中。这将清理您的视图,并使模型仅关注其包含的数据。

虽然在这种情况下,我只会有一个导致结帐的链接,如果用户未登录,请让before_filter重定向他们以登录。

答案 1 :(得分:1)

您有两个选项,您可以添加到视图助手或使用装饰器。

  1. 如果将方法添加到视图中,它将如下所示:

     def checkout_link(cart)
        if user_signed_in?
            link_to "Checkout", user_cart_path(current_user,cart), method: :patch
        else 
            link_to "Checkout", signin_path
        end
     end
    
  2. “装饰者包装模型,只处理表达问题。在控制器中,你将文章装饰到视图之前。” 1 如果你想使用装饰师,查看Ryan Bates的Railscast:using an existing gemcreating a decorator from scratch

  3. 1 引自Draper gem的自述文件。 https://github.com/drapergem/draper

答案 2 :(得分:1)

几乎那里。您希望checkout_link方法在辅助文件中成为“辅助方法”,而不是在模型文件中。因此,创建一个名为app/helpers/carts_helper.rb的文件,并在那里移动checkout_link方法。帮助文件中的方法可用于视图和控制器。

当我刚学习Rails时,我会这样做:

rails generate scaffold Dummy

专门查看它生成的文件,包括帮助文件。这可能是一个很好的起点。