2013-03-31 3 views
0

У меня есть модель 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], но я не понимаю, как ее решить.

Также, правильно ли добавить этот фильтр в контроллер? Может быть, это должно быть на уровне модели? Или, может быть, лучше добавить префикс «на лету», создавая представление, поэтому я должен его там положить?

Большое спасибо!

ответ

1

Я думаю, что проблема с вашей логикой заключается в том, что вы проверяете равенство на регулярном выражении, а не на фактический тест регулярного выражения (= ~ или! ~).

Я бы рекомендовал сделать это в вашей модели закладок. Это будет легче протестировать, и, похоже, ответственность за модель за то, чтобы узнать, какой действительный URL-адрес. Вы можете сделать это, переопределив метод установки URL-адресов, который автоматически генерируется активной записью:

class Bookmark < ActiveRecord::Base 
    def url=(link) 
    unless link =~ /https?:\/\/[a-zA-Z0-9\-\.]+\.[a-z]+/ 
     link = "http://#{link}" 
    end 

    super 
    end 
end 
Смежные вопросы