2017-11-03 7 views
0

私はこの問題を知らない。 gemを使用してdeviseとglobalize。 原因はわかりませんが、form_forはHTMLで間違ったアクションを生成します:パッチルーティングエラーテスト中のRails 5

フォームclass = "edit_status" id = "edit_status_1" action = "/ 1/statuses/update" method = "post "accept-charset =" UTF-8 "

ステータスの前にIDを配置します。どうしてか分かりません。 (:statuses_update_path(@status)、メソッド::@status、URLポスト)のform_for

のform_for

| fのか|

コントローラがid = updateを受信して​​いたために、設定されたメソッドのポストがありません。

以下に問題点を示します。

エラー

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 

レールルート

Routes

コントローラ

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 

テストコード

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 

何かが欠けていますか?

答えて

0

あなたがしようとしていることはすぐにわかりません。

post 'statuses/update' 
    resources :statuses, only: [:update] 

あなたがここで定義された2つのルートを持っている - 1には、追加の引数を取りませんステータス/更新のポストであり、第二は、/ステータス/ STATUS_IDです。あなたはその後、

statuses_update_path(@status) 

を呼び出すとIDのparamを受け入れていない、そのルートを除いて、パスを引数として@statusを渡している

は、それはロケールのparamを受け入れます。

ルートがステータス/更新で、それ以上のRESTfulステータスではない理由がありますか?最初のルートを削除し、組み込みのRails命名規則を使用します。

編集: また、テストコードでは、2つ目のルートのみをテストしています。なぜ、2つの異なるルートがあり、それらを切り替えるのかは不明です。

+0

私はRESTfulについて最もよく研​​究し、コードを修正し、最初のルートを削除し、Railsの命名規則を使用します。ポストajaxを使用していたので、間違ったルートを追加してください。なぜなら、ajaxを動作させないからです。しかし、問題は同じAjax請求書にあった。手伝ってくれてありがとう。 –