0

この質問は単一の列の質問に答えましたが、複数の列に対してどのように答えますか? ユーザーがフォームに入力しない場合に備えて、http を前に付けたい 3 つの列 (website、fb、twitter) があります。

私はこれを試しましたが、うまくいきません:

before_save :sanitize_links

private

def sanitize_links
  website = self.website
  facebook = self.facebook
  twitter = self.twitter
  links = [website, facebook, twitter]
  links.each do |link|
    unless link.include?("http://") || link.include?("https://")
      link = "http://" + link
    end
  end
end

アップデート

KL-7 の提案を試してみましたが、残念ながら少し問題がありました。配列の出力を で使用するにはどうすればよいbefore_saveですか? 以下のコードを試しましたが、うまくいきません。

before_save :sanitize_links

private

def sanitize_links
  links = ["website", "facebook", "twitter"]
  links.map! { |link| self.link =~ %r{\Ahttps?://} ? self.link : "http://" + self.link }
end

更新 2

私はあきらめた。3回繰り返します:

before_save :sanitize_links

private

def sanitize_links # prefix user-submitted links with http:// if missing
  self.website =~ %r{\Ahttps?://} ? self.website : self.website = "http://" + self.website
  self.facebook =~ %r{\Ahttps?://} ? self.facebook : self.facebook = "http://" + self.facebook
  self.twitter =~ %r{\Ahttps?://} ? self.twitter : self.twitter = "http://" + self.twitter
end
4

1 に答える 1

1

問題はそれです

link = "http://" + link

linkあなたのコードでは、ブロック内の変数に新しい値を割り当てますが、リストの対応する要素は変更しません。

リストの要素をその場で変更するには、次を使用できますArray#map!

links.map! do |link|
  link.include?("http://") || link.include?("https://") ? link : "http://" + link
end

私が少し心配しているもう1つのことは、指定された部分文字列(たとえば、文字列の途中で発生し、必ずしも最初に発生するとは限らないinclude?場合でもtrueを返すことです。そのタスクには正規表現を使用したいと思います:'http://'

links.map! { |link| link =~ %r{\Ahttps?://} ? link : "http://" + link }

アップデート

がモデルの属性である場合、ローカル変数linkとしてではなく、少なくとも属性として保存する必要があります。links

self.links = links.map { |link| link =~ %r{\Ahttps?://} ? link : "http://" + link }
于 2012-07-07T14:04:00.380 に答える