我正在尝试构建一个链接缩短器。预期的行为是在第一页(新)上,用户插入他的长链接并按下按钮,然后他被重定向到另一个名为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应该是重定向吗?
答案 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)内的路由。