如何正确重构代码:

时间:2016-12-16 19:05:47

标签: ruby-on-rails ruby

我正在我的rails应用程序中创建一个类似的模型。首先我写了这样的东西:

- if BonusLikePolicy.new(current_user, bonus).create?
      = link_to bonus_likes_path(bonus), method: :delete,
                data: { remote: true, behavior: "fragments" } do
        span.dislike
    - else
      = link_to bonus_likes_path(bonus), method: :post,
                data: { remote: true, behavior: "fragments" } do
        span.like

它工作正常,但正如你在这里看到的几个重复。所以我需要让它干并重写为:

= bonus.link_to_like(bonus, current_user)

创建奖励方法:

def link_to_like(bonus, user)
    options = { class: "like", method: :post }
    options = { class: "dislike", method: :delete } unless BonusLikePolicy.new(user, bonus).create?

    h.link_to(
      h.tag(:span, class: options[:class]), h.bonus_likes_path(bonus),
      method: options[:method], data: { remote: true, behavior: "fragments" }
    )
  end

我有一个错误,未定义的方法为nil类销毁。也许我错过了一些但却找不到的东西。请帮助:)

UPD:

我的span图标也没有正确显示(这意味着我在h.tag中传递的类也没有通过)

NoMethodError (undefined method `destroy' for nil:NilClass):


app/controllers/likes_controller.rb:12:in `destroy'

2 个答案:

答案 0 :(得分:1)

根据您在工作代码段中的逻辑

unless替换为if

options = { class: "dislike", method: :delete } if  BonusLikePolicy.new(user, bonus).create?

答案 1 :(得分:1)

我不喜欢重写选项。在我看来,最好做某事......

第1步。

options = (!BonusLikePolicy.new(user, bonus).create? ? { class: "dislike", method: :delete } : { class: "like", method: :post })

第2步。 制作私人方法

def can_not_create_like?
  !BonusLikePolicy.new(user, bonus).create?
end

第3步。

options = (can_not_create_like? ? { class: "dislike", method: :delete } : { class: "like", method: :post })
相关问题