jeudi 2 novembre 2017

Patch routing error Rails 5 in test

I have no idea of the problem. Using gems devise and globalize. I don't know if is the cause, but form_for generate wrong action in html, look:

form class="edit_status" id="edit_status_1" action="/1/statuses/update" method="post" accept-charset="UTF-8"

Id's placing before statuses. I don't know why.

Form_for

form_for(@status, url:statuses_update_path(@status), method: :post) do |f|

Setted method post because the controller was receiving id = update without it.

The problem detail below.

Error

No route matches {:action=>"/statuses/390022407", :controller=>"statuses", :status
=>{:content=>"Lorem ipsum"}}

Routes.db

Rails.application.routes.draw do
   scope "(:locale)", locale: /en|pl/ do
      post 'statuses/update'
      resources :statuses, only: [:update]
   end
end

Rails routes

Routes

Controller

class StatusesController < ApplicationController
    before_action :authenticate_user!
    before_action :set_locale

    def update
        #code...
    end

    private
        def status_params
            params.require(:status).permit(:content)
        end

        def set_locale
            I18n.locale = params[:locale] || I18n.default_locale
        end
end

Test code

require 'test_helper'

class StatusesControllerTest < ActionController::TestCase
    include Devise::Test::ControllerHelpers

    def setup
        @user = users(:brock)
        @status = statuses(:statusBrock)
        I18n.default_locale = :en
    end

    test "should not update when not logged in" do
        patch status_path(@status), params: { status: { content: "Lorem ipsum" } }
        assert_redirected_to new_user_session_path
    end

    test "should update when logged in user admin" do
        sign_in @user
        patch status_path(@status), params: { status: { content: "Lorem ipsum" } }
        assert_equal "Lorem ipsum", @status.content 
    end
end

Something's missing?

Aucun commentaire:

Enregistrer un commentaire