我有一个bookmark
模型,其:url
属性。我需要以正确的格式将其保存在数据库中:使用http://
或https://
前缀。
所以,在bookmarks_controller
我为before_filter
行动做了create
:
class BookmarksController < ApplicationController
before_filter :standardise_urls, only: :create
.
.
.
def create
@bookmark = current_user.bookmarks.build(params[:bookmark])
if @bookmark.save
flash[:success] = "Bookmark created!"
redirect_to root_url
else
render 'static_pages/home'
end
end
.
.
.
private
def standardise_urls
if params[:bookmark][:url] != /https?:\/\/[a-zA-Z0-9\-\.]+\.[a-z]+/
params[:bookmark][:url] = "http://#{params[:bookmark][:url]}"
end
end
end
但它不起作用。我希望它在用户添加时将http://
前缀添加到没有它的链接。但它继续为所有创建的链接添加前缀。
我认为错误在于重复params[:bookmark][:url]
,但我不明白如何解决它。
此外,在控制器中添加此过滤器是否正确?也许它必须在模型水平?或者也许最好在生成视图时动态添加前缀,所以我必须把它放在那里?
非常感谢!
答案 0 :(得分:1)
我认为你的逻辑问题是你正在测试正则表达式上的相等性,而不是进行实际的正则表达式测试(=〜或!〜)。
我建议您在书签模型中执行此操作。它将更容易测试,模型的责任似乎是知道有效的URL是什么。您可以通过覆盖由Active Record自动生成的url setter方法来完成此操作:
class Bookmark < ActiveRecord::Base
def url=(link)
unless link =~ /https?:\/\/[a-zA-Z0-9\-\.]+\.[a-z]+/
link = "http://#{link}"
end
super
end
end