Dynamic URL -> Controller mapping for routes in Rails

后端 未结 4 918
死守一世寂寞
死守一世寂寞 2020-12-13 10:55

I would like to be able to map URLs to Controllers dynamically based on information in my database.

I\'m looking to do something functionally equivalent to this (ass

4条回答
  •  萌比男神i
    2020-12-13 11:28

    As suggested in the question Rails routing to handle multiple domains on single application, I guess you could use Rails Routing - Advanced Constraints to build what you need.

    If you have a limited space of controllers (with unlimited views pointing to them), this should work. Just create a constraint for each controller that verifies if the current view matches them.

    Assuming you have a space of 2 controllers (PostController and CommentController), you could add the following to your routes.rb:

    match "*path" => "post#show", :constraints => PostConstraint.new
    match "*path" => "comment#show", :constraints => CommentConstraint.new
    

    Then, create lib/post_constraint.rb:

    class PostConstraint     
      def matches?(request)
        'post' == Rails.cache.fetch("/view_controller_map/#{request.params[:view_name]}") { View.find_by_name(request.params[:view_name]).controller }
      end
    end
    

    Finally, create lib/comment_constraint.rb:

    class CommentConstraint     
      def matches?(request)
        'comment' == Rails.cache.fetch("/view_controller_map/#{request.params[:view_name]}") { View.find_by_name(request.params[:view_name]).controller }
      end
    end
    

    You can do some improvements, like defining a super constraint class that fetches the cache, so you don't have to repeat code and don't risk fetching a wrong cache key name in one of the constraints.

提交回复
热议问题