2016-05-25 13 views
1

"Clients"という名前の現在のコントローラーで "新規"アクションにリンクしているボタンに問題があります。Rails上のルートを使ってRails上でリンクを生成する方法は?

それはRailsのルーティングエラーを表示するクリック:

No route matches [POST] "clients/new"

これは、私はそれがエラーを生成し使用しているコードです:

<%= button_to("New Client", new_client_path, :class => "btn btn-lg btn-primary pull-right add-button") %> 

私はclients_pathへのパスを変更した場合は、同様にこれは:

<%= button_to("New Client", clients_path, :class => "btn btn-lg btn-primary pull-right add-button") %> 

次のエラーが表示されます。

Unknown action. The action 'create' could not be found for ClientsController

コントローラのアクション新しく作成:

def new 
    @client = Client.new 
end 

def create 
    @client = Client.new(client_params) 

    if @client.save 
    flash[:notice] = "Client added succesfully." 
    redirect_to client_path(@client) 
    else 
    render 'new' 
    end 
end 

をroutes.rbをファイルには以下が含まれています。今

Rails.application.routes.draw do 

    get 'clients/index' 

    get 'clients/show' 

    get 'clients/new' 

    get 'clients/edit' 

    get 'clients/delete' 

    resources :clients 

end 

clientsは、私が作成している唯一の資源です。 RESTfulなルートを使って簡単にリンクを作成するには、何が欠けていますか?

答えて

1

いくつかのことをする必要があなたのためにこの作品を作るために変更してください。まず、ルートは冗長で、Railsのコンベンションと競合します。 get経路はすべて削除し、resources経路のみを使用してください。 POST方法に

Rails.application.routes.draw do 

    # notice, no "get" routes 

    resources :clients 
end 

次に、button_toデフォルトなので、あなたはGETルートでそれを使用している場合、それは方法だオーバーライドすることがあります。これは、あなたのクライアントルートのために必要なものすべてです。詳細については、button_to API documentationを参照してください。

代わりに、これを試してください:

<%= button_to("New Client", new_client_path, { method: :get, :class => "btn btn-lg btn-primary pull-right add-button" }) %> 

button_toは、ActionViewフォームヘルパーの多くのように、2つの独立したハッシュ、最初はoptionsされ、及び第二のhtml_optionsことを受け入れること。ハッシュ値を分離することが重要です。そうしないと、探している動作が得られません。 methodclassのオプションはhtml_optionsです。あなたの呼び出しでただ1つのオプションのハッシュ(中括弧はオプションです)がある場合、Rubyは最後のハッシュ引数にそれらを割り当てます。あなたが明示的にこのように、あなたが意図したものを、コードの読者にそれを明確にするために、すべてのハッシュを供給することができます:

<%= button_to("New Client", new_client_path, {}, { method: :get, :class => "btn btn-lg btn-primary pull-right add-button" }) %> 

最終、clients_pathルートヘルパーを使用する試みはClientController#index方法のためにパスが生じた(例えば/clients)、それに伴って一見無関係なcreateメソッドのエラーが発生します。 createアクションは、indexアクションと同じURLパスを持つPOSTルートです。あなたはこのリソースのrake routesの出力を見れば、あなたは次のように表示されます:

 Prefix Verb URI Pattern     Controller#Action 
    clients GET /clients(.:format)   clients#index 
      POST /clients(.:format)   clients#create 
    new_client GET /clients/new(.:format)  clients#new 
edit_client GET /clients/:id/edit(.:format) clients#edit 
     client GET /clients/:id(.:format)  clients#show 
      PATCH /clients/:id(.:format)  clients#update 
      PUT /clients/:id(.:format)  clients#update 
      DELETE /clients/:id(.:format)  clients#destroy 

は両方clients(「プレフィックス」の下では)パス/clientsため、直接その下にGETと一致するか、があります参照してください。 POSTの無名エントリは同じ/clientsパスになります。右端には、GETメソッドがclients#indexアクションにルーティングされ、POSTメソッドがclients#createアクションにルーティングされることがわかります。

この場合、デフォルト方法button_toはアクションにルーティングしようとしていたPOSTのアクションです。これは実行していない操作です。 createupdate、またはdestroyのメソッドに何かを直接送信することはほとんどありません。また、いくつかの場合、あなたはそれを非常に意図的に行い、異常ではない(ちょうど異常ではない)Rails使用法。

+0

これは私の約束を解決しましたが、 '<%= button_to(" New Client "、clients_path、{method::get}、{:class =>" btn btn-lg btn-primaryプル右私は 'clients_path'から' new_client_path'へのルートを修正しなければなりません。引数の数が無効であるため、同じ中括弧の中のメソッドとクラスを修正する必要がありました。これは、<%= button_to( "New Client"、new_client_path、{method::get、class: 'btn btn-lg btn-primaryプル右追加ボタン'})%> 'のように動作しました。回答を編集して回答としてマークしてください。 –

+0

@JorgeCuevas偉大なフィードバックと、私に知らせてくれてありがとう!私は答えを更新し、 'button_to'の2つのハッシュについてもう少し説明を加えました。 'new_client_path'の問題はコピー/ペーストエラーであり、ハッシュオプションの問題はドキュメントの誤読でした。それらは今すぐ選別され、あなたが確認する準備ができています。ありがとう! –

+0

すべてこれはうまくいけば、これは将来同様の問題を持つ他の人に役立つと思われる。あなたの助けを借りてくれたマイケルに感謝します。 –

1

あなたroutes.rbをチェックして、あなたがresources :clientsが追加されていることを確認してください。

またdocumentationを見て、あなたが誤ってルートを呼び出していることがわかります。

Ex。 clients_new_pathnew_client_path

とする必要があります。これらの変更を行っても問題が解決しない場合は、エラーがあなたのClientsControllerにあるようです。

あなたがcreateアクションが追加されていることを確認してください。

def create 
@client = Client.new(client_params) 

if @client.save 
    flash[:notice] = 'App successfully created!' 
    redirect_to client_path(@client) 
else 
    flash[:error] = @app.errors.full_messages.join(', ') 
    render 'new' 
end 

エンド

+0

routes.rbファイルには、各ビューに対して自動的に生成されるgetルートを持つresources:clientsが含まれています。 new_client_pathに変更しようとしましたが、正確に同じルーティングエラーメッセージが表示されます。 –

+0

私はそれを持っていましたが、空でした。それを埋めるが、同じエラーが表示されます。ルートファイルに何か不足していますか? –

+0

コントローラーとroutes.rbファイルを元の投稿に追加しました。 –

1

この方法で試してみてください:

<%= button_to("New Client", new_client_path, :class => "btn btn-lg btn-primary pull-right add-button") %> 

あなたは、 "クライアント" を使用する必要はなく、 "クライアント" とは、単一のクライアントを作成するために

+0

既に質問されているように試しましたが、クリックすると同じエラーが表示されます。投稿の現在の状態を表示するように投稿を編集しました。 –

+0

あなたはあなたのclient_conroller.rbを投稿できますか? –

+0

元の投稿に追加しました。 –