重定向到rails中的另一个视图

时间:2015-06-03 11:03:25

标签: ruby-on-rails controller

我正在尝试构建一个链接缩短器。预期的行为是在第一页(新)上,用户插入他的长链接并按下按钮,然后他被重定向到另一个名为result的页面,其中预设的消息将等待他,以及他的短片和长链接。

然而,我正在与控制器挣扎,因为无论我做什么,总会出现问题。现在我的控制器看起来像这样:

    class UrlsController < ApplicationController
  def new
    @short_url = Url.new
  end

  def create
    @short_url = Url.new(url_params)
    if @short_url.save
      flash[:short_id] = @short_url.id
      redirect_to "/urls/result"
    else
      render action: "new"
    end
  end

  def show
    Url.find(params[:id])
    #@short_url_yield =
    redirect_to @short_url.url
  end

  def result

  end

  private

  def url_params
    params.require(:url).permit(:url)
  end

end

和routes.rb:

Rails.application.routes.draw do
  resources :urls, :only => [:show, :new, :create, :result]
  get 'urls/result' => 'urls#result'
  root to: redirect('/urls/new')
end

但是,当我提交链接时,rails会返回以下错误:

Couldn't find Url with 'id'=result
Extracted source (around line #17):

def show
Url.find(params[:id])
#@short_url_yield =
redirect_to @short_url.url
end

我似乎不明白它背后的逻辑。出了什么问题?当我点击缩短的链接时,show bit应该是重定向吗?

1 个答案:

答案 0 :(得分:1)

Rails路由按照定义的顺序具有优先级。由于您的SHOW路由声明在获取'urls/result' => 'urls#result'之前,因此网址会匹配为/urls/id=result

只需将自定义路线移到资源块上方或使用集合块。

resources :urls, :only => [:show, :new, :create, :result] do
  collection do
    get 'result'
  end
end

使用collection and member块告诉Rails优先考虑普通CRUD操作(如show)内的路由。