为什么我的if / elsif语句没有创建标记链接并将它们发送到不同的路由?

时间:2014-03-05 05:14:53

标签: ruby-on-rails ruby ruby-on-rails-4 gem helper

我的if / elsif语句仅执行if,而不是elsif。我无法理解为什么会这样做。很抱歉没有解释这是如何工作的。以下编辑解释了它。

它正在使用一串文本(用户发布)并检查其中是否有标记。如果文本有标签,那么它会将其变成链接。最终结果是标签变为链接的用户字符串。 REGEX是正则表达式,用于查看它是否包含@#$这些标记之一。它们不相关,因为我知道它们是正确的。对于样本输入,它可以是来自twitter @user is #cool

的任何类型的帖子
REGEXS = [Supertag::Tag::USERTAG_REGEX, Supertag::Tag::HASHTAG_REGEX, Supertag::Tag::MONEYTAG_REGEX]

def linkify_tags(taggable_content)
  text = taggable_content.to_s

  REGEXS.each do
    if text = text.gsub(Supertag::Tag::USERTAG_REGEX) {link_to($&, usertag_path($2), class: 'tag')}
    elsif text = text.gsub(Supertag::Tag::HASHTAG_REGEX) {link_to($&, hashtag_path($2), class: 'tag')}
    elsif text = text.gsub(Supertag::Tag::MONEYTAG_REGEX) {link_to($&, moneytag_path($2), class: 'tag')}
    end  
  end     

  text.html_safe
end

有没有人对它为什么不起作用有任何建议或解释?它只执行if/elsif

中的第一个

2 个答案:

答案 0 :(得分:2)

如果您使用if / else语句,则需要根据答案提出问题并执行其中一个问题。它被称为条件语句,因为您希望在提供操作之前满足条件。只有在给出答案后,您才能告诉他下一步该做什么。

现在,你正在做的是相反的事情。你告诉做什么,而不问问什么时候去做。难怪它只运行if语句,因为这个语句总是返回true。你面临的问题是你的第一个条件永远不会是假的或零。

根据经验,问题/条件应始终有多个可能的答案,否则没有必要提出问题。

答案 1 :(得分:1)

此代码:

if foo = any_value_other_than_false_or_nil
  # this will always run
else …
  # this will never run
end

这是因为您要将值分配给变量foo,结果为'truthy'(除非您指定的值为nilfalse)。

我想也许您打算使用regex == …来测试正则表达式变量是否与常量匹配,或者可能regex =~ …来测试正则表达式变量是否在字符串中找到匹配项。同样,也许您的意思是text == …而不是text =,以便比较它们是否相等而不是更改变量的值。

  

第一个告诉我有一个意外的“{”

这是因为Ruby(和我)不知道你的意思:

if foo = SomeConstant { some_code }

也许如果您提出另一个问题来描述您的意图 - 而不仅仅是您的代码 - 其他人可以帮助您实现最终目标,而不是回答有关症状的问题。