Ruby on Rails Restricciones


Ejemplo

Puede filtrar qué rutas están disponibles usando restricciones.

Hay varias formas de usar restricciones, incluyendo:

Por ejemplo, una restricción basada solicitada para permitir solo una dirección IP específica para acceder a una ruta:

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

Vea otros ejemplos similares ActionDispatch :: Routing :: Mapper :: Scoping .

Si desea hacer algo más complejo, puede usar restricciones más avanzadas y crear una clase para envolver la lógica:

# 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

Una forma, varios botones de enviar

También puede utilizar el valor de las etiquetas de envío de un formulario como una restricción para enrutar a una acción diferente. Si tiene un formulario con varios botones de envío (por ejemplo, "vista previa" y "envío"), podría capturar esta restricción directamente en su routes.rb , en lugar de escribir javascript para cambiar la URL de destino del formulario. Por ejemplo, con la gema commit_param_routing puede aprovechar las ventajas de rails submit_tag

submit_tag primer parámetro de Rails submit_tag permite cambiar el valor de su parámetro de confirmación de formulario

# 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