2013-03-31 69 views
0

我有一个bookmark型号,具有:url属性。我需要将它以正确的格式保存在数据库中:使用http://https://前缀。保存到数据库之前编辑数据

所以,在bookmarks_controller我做了一个before_filtercreate行动:

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],但我不明白如何解决它。

此外,在控制器中添加此过滤器是否正确?也许它必须在模型级别?或者,当生成视图时,最好在动态添加前缀,所以我必须把它放在那里?

非常感谢!

回答

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 
相关问题