2017-09-06 2 views
3

내 프로그램에 문제가 있습니다. DB에 링크 (예 : "www.google.com")를 추가하고 링크를 클릭하면 리디렉션됩니다. localhost : 3000/www.google.com, DB에 "http://www.google.com"을 입력하면 발생하지 않습니다.레일에서 절대 'link_to'로 변환하는 방법

내 코드 나는 절대 항상이 링크를 변환하기 위해 어떻게해야합니까

<td><%= link_to t.title, t.link_to_idea, :target => "_blank" %></td> 

? (나는이 해결책이라고 생각한다)

고마워! 그게 당신이 모든 링크에 http가 아닌 https로 저장할 가정합니다 ..하지만

<td><%= link_to t.title, t.link_to_idea.start_with?('http') ? t.link_to_idea : "http://#{t.link_to_idea}", :target => "_blank" %></td> 

:

+2

어쩌면 단순히 "데이터베이스를 업데이트하고 추가 HTTP : /을/"필요한 곳에? –

+1

@SergioTulentsev가 추천 한 것을 제안합니다. https://stackoverflow.com/questions/7908598/add-https-to-url-if-its-not-there – AbM

+0

하지만 DB를 수정할 수있는 권한이 없으며, 항상 내 코드를 수정해야합니다. 링크 저장하려면 http 또는 https를 입력하십시오. 그러나 하나의 옵션 만 사용할 수 있습니다. –

답변

0

당신이 뭔가를 할 수 있습니다. DB에 링크를 저장하기 전에 프로토콜 검사를 사용하는 것이 좋습니다.

예를 들어, 당신이 대답에서 알 수 무엇을 할 수있는 : Add http(s) to URL if it's not there?

before_validation :smart_add_url_protocol 

protected 

def smart_add_url_protocol 
    unless self.url[/\Ahttp:\/\//] || self.url[/\Ahttps:\/\//] 
    self.url = "http://#{self.url}" 
    end 
end 

당신은 당신이 이미 가지고 무엇을 할 수있는 방법을.

+0

나는이 순간까지 당신의 해결책이 최고라고 생각하지만 어떻게하면 http 나 https를 하나 선택해야만 할까?나는 DB 칼럼에있는 것을 지시했습니다. –

+0

제 친구, 당신의 쇠약이 효과가있었습니다. 이제 링크 위에 마우스를 올려 놓으면 "www.google.com"링크와 더 이상 "localhost : 3000/www.google.com"이 표시되지 않습니다. 대단히 감사합니다! –

0

나는 모든 것이 표준 형식을 따르도록 데이터베이스의 링크를 업데이트하는 것이 가장 좋습니다. 또한 사람을 업데이트 그들은이 패턴과 일치하는 확인 된 링크를 확인 데이터베이스에 백필을 실행할 수 있습니다

validates :link_to_idea, format: URI.regexp 

: 당신은 모든 링크가 올바른 형식과 일치하는지 확인하기 위해 더 기본적인 유효성 검사를 추가 할 수 있습니다 그게 작동하지 않습니다. MySQL을 사용하고 있습니까?

어느 쪽이든, 가장 좋은 대답은 사용자가 입력 한 오래된 것을 렌더링하려고 시도하는 것이 아니라 데이터베이스에 들어가기 전에 데이터를 정리하는 것입니다.

데이터베이스에 들어가는 것을 제어 할 수 없다면 텍스트로 렌더링하고 Regexp와 일치하지 않는 것을 렌더링하고 사용자가 직접 브라우저에 넣을 수있게합니다.

+0

그래서 Postgres를 사용하지만 DB에 수정할 수있는 접근이 없습니다 –

+0

나는 유효하다고 생각합니다. (더러운 데이터를 얻지 않고 페이지에 출력 한 URL을 확인하십시오. Regex를 통해) 일치하지 않으면 링크를 만들지 마십시오. – apanzerj

0

Draper을 사용하여 데코레이터를 만드는 것이 좋습니다. 이렇게하면 도메인 객체에서 프리젠 테이션 로직을 분리 할 수 ​​있습니다.

당신은 당신이 비슷한 쓸 수를 설정 한 후에 :

# app/decorators/idea_decorator.rb 
class IdeaDecorator < Draper::Decorator 
    delegate_all 

    def idea_url(protocol = 'https') 
    return link_to_idea if has_scheme? 

    "#{protocol}://#{link_to_idea}" 
    end 

    private 

    def has_scheme? 
    # .. some method here to determine if the URL has a protocol 
    end 
end 

을 그리고보기에 사용 :

<%= link_to t.title, t.decorate.idea_url('https') %>