我正在使用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>
我做错了什么? 感谢。
答案 0 :(得分:2)
你做错的事情是关于你的模型与视图。这不应该这样做。
您应该将checkout_link
放在视图助手方法中。这将清理您的视图,并使模型仅关注其包含的数据。
虽然在这种情况下,我只会有一个导致结帐的链接,如果用户未登录,请让before_filter
重定向他们以登录。
答案 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
“装饰者包装模型,只处理表达问题。在控制器中,你将文章装饰到视图之前。” 1 如果你想使用装饰师,查看Ryan Bates的Railscast:using an existing gem或creating a decorator from scratch。
1 引自Draper gem的自述文件。 https://github.com/drapergem/draper
答案 2 :(得分:1)
你几乎那里。您希望checkout_link
方法在辅助文件中成为“辅助方法”,而不是在模型文件中。因此,创建一个名为app/helpers/carts_helper.rb
的文件,并在那里移动checkout_link
方法。帮助文件中的方法可用于视图和控制器。
当我刚学习Rails时,我会这样做:
rails generate scaffold Dummy
专门查看它生成的文件,包括帮助文件。这可能是一个很好的起点。