UrlGenerationError:没有路由匹配,缺少必需的密钥和link_to

时间:2014-05-24 03:18:41

标签: ruby-on-rails ruby ruby-on-rails-4 rails-routing

我在rails上遇到静态页面策略问题。

我有一个处理静态页面的控制器。基本上,它会读取app/views/static目录中的模板并按要求进行渲染。像这样:

class StaticController < ApplicationController
  def show
    templ = File.join(params[:controller], params[:page])
    puts params, templ
    render templ
  rescue ActionView::MissingTemplate => e
    if e.message =~ %r{Missing template #{templ}}
      raise ActionController::RoutingError, 'Not Found'
    else
      raise e
    end
  end
end

这些是我的路线:

Rails.application.routes.draw do
  root 'static#show', page: 'home'
  get ':page', to: 'static#show', as: :static, constraints: { page: /a-zA-Z\-_\/+/ }
end

根路由工作正常,我能够很好地访问视图。我没有错。 现在,在我的标题部分,我有这个,编辑为简单/相关性:

<%= link_to('Home', static_path(:home)) %>

部分或主模板中没有其他ruby代码。我不确定我做错了什么。这个错误没有意义。

ActionController::UrlGenerationError - No route matches {:action=>"show", :controller=>"static", :format=>nil, :page=>:home} missing required keys: [:page]

缺少所需密钥的确切位置?我没有任何其他对象或模特。

现在这很好用:

<%= link_to('Home', controller: 'static', action: 'show', page: 'home') %>

那么我如何使static_path像这样工作呢?

感谢。

2 个答案:

答案 0 :(得分:1)

我认为使用约束的正则表达式存在问题,我建议将其从路径定义中删除,因为您已经检查控制器中是否存在模板。

另外,你应该看看high_voltage gem,它可以很好地处理创建静态页面。

答案 1 :(得分:0)

我的第一个猜测是:

<%= link_to 'Home', static_path("home") %> #-> try passing a string, rather than symbol

应该允许您引用所需的路径

-

class StaticController < ApplicationController
  def show
    templ = File.join(params[:controller], params[:page])
    puts params, templ
    render templ
  rescue ActionView::MissingTemplate => e
    if e.message =~ %r{Missing template #{templ}}
      raise ActionController::RoutingError, 'Not Found'
    else
      raise e
    end
  end
end

我个人会让这更简单:

class StaticController < ApplicationController
  def show
    render "pages#{params[:page]}
  end
end