代码之家  ›  专栏  ›  技术社区  ›  Hakanai

是否可以将自定义路径附加到铁路路线的“新”路径?

  •  1
  • Hakanai  · 技术社区  · 14 年前

    我想做的是:

    我正在建立一个不同类型的岗位体系。撇开模型不谈,这个问题是关于路线和控制器的。

    基本上 /posts/new 应转到排序的索引页,而 /posts/new/anything 应该查找类型 anything 然后构建一个用于创建新表单的表单。

    我是如何做到这一点的:

    请随意忽略这一部分,因为我可能完全走错了轨道。

    在路由配置中:

    map.connect '/posts/new', :controller => 'posts', :action => 'new_index'
    map.resources :posts, :path_names => { :new => 'new/:type' }
    

    在控制器中:

    class PostsController
      # implicit: def new_index ; end
    
      def new
        @post = class_for_type(params[:type]).new
      end
    end
    

    该视图具有查看@post类型以确定要使用哪组视图的代码。结果这让我有90%的路要走: /posts/new/quip 是否实际将我发送到正确的页面以创建Quip,等等。 /职位/新 将我发送到索引页。

    问题是双重的。

    1. 我仍然希望有这样的方便方法:

      <%= link_to 'New Post', new_post_path %>
      

      但现在这是无效的 new_post_path 需要 :type 参数。

    2. 如果可能的话,我想用一条路线。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Hakanai    14 年前

    彼得·瓦格纳特的解决方案给了我拼图中缺失的部分。( :type => nil )这让我可以在一行中完成:

    map.resources :posts, :path_names => { :new => 'new/:type' },
                  :requirements => { :type => nil }
    

    当然,我还是要去控制器那里修好它 new_index.html.erb :new 行动。

    (好吧,我想已经不是一行了。)

    new_post_path                     # => '/posts/new/'
    new_post_path(:type => 'quip')    # => '/posts/new/quip'
    new_post_path('quip')             # => '/posts/new/quip'
    
        2
  •  2
  •   Peter Wagenet    14 年前

    如果您可以共享这些操作,则可以设置以下内容:

    # Routes
    map.new_person '/people/new/:type', :controller => :people, :action => :new, :type => nil
    map.resources :people, :except => [:new]
    
    # Controller
    class PeopleController < ApplicationController
    
      def new
        unless params[:type]
          render :action => :new_index and return
        end
    
        @post = class_for_type(params[:type]).new
      end
    
    end
    

    这允许您以默认格式保留单个路由以及指定类型的能力:

    new_person_path                      # => /people/new/
    new_person_path(:type => 'anything') # => /people/new/anything
    new_person_path(:employee)           # => /people/new/employee
    
        3
  •  0
  •   Damien MATHIEU    14 年前

    我认为您应该看看Rails的单表继承: http://juixe.com/techknow/index.php/2006/06/03/rails-single-table-inheritance/

    这将使管理您的日志类型变得更加容易,因为您有许多模型继承了全局模型,但基于相同的SQL基。

    对于您的问题本身,为什么不重新定义新的路径助手方法呢? 比如:

    def new_post_path
        { :controller => 'posts', :action => 'new', :type => params[:type] }
    end
    

    现在将根据参数数组自动给定类型。