Ruby on Rails vincoli


Esempio

Puoi filtrare quali percorsi sono disponibili usando i vincoli.

Esistono diversi modi per utilizzare i vincoli, tra cui:

Ad esempio, un vincolo basato su richiesta per consentire solo a un indirizzo IP specifico di accedere a una rotta:

constraints(ip: /127\.0\.0\.1$/) do
  get 'route', to: "controller#action"
end

Vedi altri esempi simili ActionDispatch :: Routing :: Mapper :: Scoping .

Se vuoi fare qualcosa di più complesso puoi usare vincoli più avanzati e creare una classe per avvolgere la logica:

# lib/api_version_constraint.rb
class ApiVersionConstraint
  def initialize(version:, default:)
    @version = version
    @default = default
  end

  def version_header
    "application/vnd.my-app.v#{@version}"
  end

  def matches?(request)
    @default || request.headers["Accept"].include?(version_header)
  end
end

# config/routes.rb
require "api_version_constraint"

Rails.application.routes.draw do
  namespace :v1, constraints: ApiVersionConstraint.new(version: 1, default: true) do
    resources :users # Will route to app/controllers/v1/users_controller.rb
  end

  namespace :v2, constraints: ApiVersionConstraint.new(version: 2) do
    resources :users # Will route to app/controllers/v2/users_controller.rb
  end
end

Un modulo, diversi pulsanti di invio

È inoltre possibile utilizzare il valore dei tag di invio di un modulo come vincolo per eseguire il routing a un'azione diversa. Se hai un modulo con più pulsanti di invio (ad esempio "anteprima" e "invia"), puoi catturare questo vincolo direttamente nel tuo routes.rb , invece di scrivere javascript per modificare l'URL di destinazione del modulo. Ad esempio con la gem di commit_param_routing puoi sfruttare i binari submit_tag

submit_tag parametro submit_tag Rails consente di modificare il valore del parametro di commit della submit_tag

# app/views/orders/mass_order.html.erb
<%= form_for(@orders, url: mass_create_order_path do |f| %>
    <!-- Big form here -->
  <%= submit_tag "Preview" %>
  <%= submit_tag "Submit" %>
  # => <input name="commit" type="submit" value="Preview" />
  # => <input name="commit" type="submit" value="Submit" />
  ...
<% end %>

# config/routes.rb
resources :orders do
  # Both routes below describe the same POST URL, but route to different actions 
  post 'mass_order', on: :collection, as: 'mass_order',
    constraints: CommitParamRouting.new('Submit'), action: 'mass_create' # when the user presses "submit"
  post 'mass_order', on: :collection,
    constraints: CommitParamRouting.new('Preview'), action: 'mass_create_preview' # when the user presses "preview"
  # Note the `as:` is defined only once, since the path helper is mass_create_order_path for the form url
  # CommitParamRouting is just a class like ApiVersionContraint
end