2012-09-30 2 views
0

"다른 이름으로 저장"을 클릭하는 것처럼 현재 웹 사이트를 저장하는 버튼이 필요합니다. 컨트롤러에서 외부 사이트 (예 : http://www.google.com) 내 응용 프로그램 내부의 사이트에서 작동하지 않는다면 시간 초과 오류가 발생합니다. 이버튼을 눌러 현재 페이지를 레일에 저장합니다. 3.2

문제가 무엇인지 어떤 단서 :(나에게 아무런 설명이 없다?

#CONTROLLER FILE 
def save_current_page 
    # => Using MECHANIZE 
    agent = Mechanize.new 
    page = agent.get request.referer 
    send_data(page.content, :filename => "filename.txt") 
end 
나는 또한 오픈 URI, 같은 문제를 시도

!

#CONTROLLER FILE 
def save_current_page 
# => USANDO OPEN URI 
send_data(open(request.referer).read, :filename => "filename.txt") 
end 

나는 레일 3.2과 루비를 사용하고 있습니다 1.9, 어떤 도움을 주셔서 감사 드리며, 이미 10 시간 동안 작동하도록 노력하고 있습니다!

답변

0

: 그것은 할 수없는 점에서

Bricker http://guides.rubyonrails.org/layouts_and_rendering.html에서 가져온으로 레일 "전화 번 이상 만 할 수 렌더링 할 권리 렌더링 또는 작업 당 한 번 리디렉션 "

사이트에서는"컨트롤러 동작이 끝날 때 명시 적으로 렌더링하지 않으면 레일스가 컨트롤러의 action_name.html.erb 템플릿을 자동으로 찾습니다 보기 경로와 그것을 렌더링합니다. "

그렇다면 나에게 좋은 솔루션은 다운로드 플래그 (download = true)가 설정된 경우 컨트롤러에 문자열을 렌더링하도록 알려주는 것이 었습니다. params (request.url을 사용하여 내 응용 프로그램에서보기)

보기 :

= link_to 'Download', request.url+"&downloadexcel=true", :class => 'btn btn-primary btn-block' 

컨트롤러 : 당신의 팁

def acontrolleraction 
    #some controller code here 
    if params[:downloadexcel] 
    save_page_xls 
    else 
    # render normally 
    end 
end 


def save_page_xls 
    #TRESCLOUD - we create a proper name for the file 
    path = URI(request.referer).path.gsub(/[^0-9a-z]/i, '') 
    query = URI(request.referer).query.gsub(/[^0-9a-z]/i, '') 
    filename = @project_data['NOMBRE']+"_"+path+"_"+query+".xls" 

    #TRESCLOUD - we render the page into a variable and process it 
    page = render_to_string 

    #TRESCLOUD - we send the file for download! 
    send_data(page, :filename => filename, :type => "application/xls") 
end 

감사합니다!

0

레일즈는 한 번에 하나의 요청 만 처리 할 수 ​​있습니다. 두 요청 사이에 끊임없는 대치가 있습니다. 첫 번째 요청은 두 번째 요청을 기다리지 만 두 번째 요청이 첫 번째 요청을 기다리고 있으므로 시간 초과 오류가 발생합니다. 여객 등으로 앱의 여러 인스턴스를 실행하는 경우에도 나쁜 생각입니다. 나는 그렇게 같은 조건문을 사용하는 것입니다 해결하기 위해 생각할 수있는

유일한 방법 :

referer = URI.parse(request.referer) 

if Rails.application.config.default_url_options[:host] == referer.host 
    content = "via yoursite.com" 
else 
    agent = Mechanize.new 
    page = agent.get request.referer 
    content = page.content 
end 

send_data content, filename: "filename.txt" 

약간 더러운하지만이 시간 초과 문제를 해결 받아야합니다. 멀리까지 당신의 자신의 위치에서 페이지의 실제적인 내용을 얻기 - 당신까지이다. 템플릿을 렌더링하거나 캐시에서 무언가를 가져 오거나 그냥 무시할 수 있습니다.

훨씬 더 좋은 해결책은이 코드를 Resque 또는 Delayed Job과 같은 것으로 큐에 넣는 것입니다. 그런 다음 대기열은 요청을 만들고 정상적으로 페이지를 요청하기 위해 줄을 서서 기다릴 수 있습니다. 또한 응용 프로그램이 원격 요청을하는 동안 사용자가 기다릴 필요가 없다는 것을 의미합니다. 즉, 페이지가 응답하는 데 걸린 시간을 누가 알기 때문에 위험합니다. 몇 시간 나는 최종 솔루션에 도착 다른 게시물의 많은 후

+0

안녕 Bricker, 이봐,이 시간을내어 주셔서 감사합니다. –

+0

안녕 Bricker, 난 아직도 해결되지 않는 것,이 응용 프로그램은 myapp.com/something 될 수있는 현재 페이지를 저장해야하지만, 제안 된 솔루션은 www.google과 같은 외부 사이트를 저장할 때 작동하는 것 같습니다.com을 사용하고 로컬 사이트는 제외합니다. 그러나 나는 그것을 테스트하고 문제가 남아있다 (이유를 설명 할 수 없다면, if는 작동해야하고 로컬 사이트 시나리오에서 루프를 피한다). 이걸 도와 주실 시간을 내 주셔서 고마워요. –

+0

예, 로컬 사이트를 가져 오는 방법을 결정해야합니다. 응용 프로그램을 자체적으로 원격 요청을 할 수 없으며 응용 프로그램의 여러 인스턴스를 실행하더라도 여전히 멈출 수 있습니다. 응용 프로그램 내의 페이지에서 오면 Rails.application.config.default_url_options [: host]가'referer.host'와 일치하는지 확인하십시오. – bricker

관련 문제