Digamos que yo quiero apoyar tanto a los métodos GET y POST sobre la misma URL. Cómo se podría ir sobre la manipulación que en rails acción del controlador?

InformationsquelleAutor Kevin Pang | 2011-04-07

5 Comentarios

  1. 67

    Usted puede comprobar si era un post con la solicitud.post?

    if request.post?
      #handle posts
    else
      #handle gets
    end

    Para conseguir sus rutas de trabajo:

    resources :photos do
      member do
        get 'preview'
        post 'preview'
      end
    end
    • Lo siento cavar esto pero es compartir la misma ruta por dos verbos, de alguna manera, una mala práctica?
    • Creo que puede ser. O puede sugerencia de que el diseño es un poco pobre
    • IMO no es una mala práctica si utiliza cuando tiene sentido hacerlo.
    • podemos ver esto en Rails por defecto ingeniosos de enrutamiento. #show, #update y #destroy todo el uso /models/:id con GET, PATCH y DELETE respectivamente. Mismo con #index y #create
    • Routing both GET and POST requests to a single action has security implications. De la cita de guides.rubyonrails.org
  2. 7

    Aquí otra forma. He incluido el código de ejemplo para responder con 405 por métodos no admitidos y mostrando a los métodos admitidos cuando el método de OPCIONES se utiliza en la URL.

    En app/controllers/foo/bar_controller.rb

    before_action :verify_request_type
    
    def my_action
      case request.method_symbol
      when :get
        ...
      when :post
        ...
      when :patch
        ...
      when :options
        # Header will contain a comma-separated list of methods that are supported for the resource.
        headers['Access-Control-Allow-Methods'] = allowed_methods.map { |sym| sym.to_s.upcase }.join(', ')
        head :ok
      end
    end
    
    private
    
    def verify_request_type
      unless allowed_methods.include?(request.method_symbol)
        head :method_not_allowed # 405
      end
    end
    
    def allowed_methods
      %i(get post patch options)
    end

    En config/routes.rb

    match '/foo/bar', to: 'foo/bar#my_action', via: :all
    • Las rutas en parte me ayudó a configurar las cosas como yo quería. Gracias!
    • Como de Rieles 5 (tal vez incluso 4) via: :la bandera no funciona más. En su lugar, se establece la ruta para responder a una (inexistente) «CUALQUIER» método HTTP. Debe hacer a través de: [:obtener, :post :poner, :eliminar] ahora
  3. 5

    Sólo tiene que utilizar este, para usar sólo get y post en la misma ruta

    resources :articles do
      member do
        match 'action_do-you_want', via: [:get, :post]
      end
    end
  4. 1

    usted puede probar este

    match '/posts/multiple_action', to: 'posts#multiple_action', via: [:create, :patch, :get, :options]
  5. 0

    Yo diría que la mejor manera es crear acciones separadas en el controlador y el estado en las rutas.

    # config/routes.rb
    ...
    get '/my_action' => 'my#my_action_get'
    post '/my_action' => 'my#my_action_post'
    ...
    
    # app/controllers/my_controller.rb
    ...
    def my_action_get
      # do stuff like listing smth
    end
    
    def my_action_post
      # do other stuff
    end

    De hecho, la misma lógica se utiliza Rails por defecto: index y create acciones son llamados por las solicitudes enviadas a los mismos caminos (por ejemplo,/articles), sin embargo, tienen diferentes métodos de solicitud: GET /articles solicitud se redirige a la index de acción y las listas de todos los artículos, y POST /articles se redirige a la create acción y crea un nuevo artículo.

Dejar respuesta

Please enter your comment!
Please enter your name here