2017-10-07 7 views
1

私はRubyとRailsの真の初心者です。私は2日間ソリューションを探していました。私はform_tagからアクション 'を作成するために私のコントローラに新しいエントリを追加するためにデータを提出する必要がありますが、私は何かがひどく間違っているように見えます。必要な行動に。Rails 5. form_tagからカスタムアクションへの提出方法は?

<h1>Todos</h1> 
<% @projects.each do |project| %> 
    <tr> 
     <h2><%= project.title %></h2> 
     <% project.todos.each do |todo| %> 
     <ul style="list-style-type:disc"> 
     <li><%= todo.text %></li> 
     </ul> 
     <% end %> 
    </tr> 
    <% end %> 

    <%= form_tag({controller: "mega", action: "create"}, method: "get", remote: true) do %> 
    <h2>New todo</h2> 
    <p> 
    <%= text_field_tag 'text' %> 
    </p> 
    <p> 
    <%= select_tag 'title', options_from_collection_for_select(@projects, 'id', 'title') %> 
    </p> 
    <p> 
    <%= link_to 'CANCEL' %> 
    <%= link_to 'OK', "", :onclick => "$('#form_id').submit()" %> 
    </p> 
<% end %> 

とコントローラ:

class MegaController < ApplicationController 
    def index 
    @projects = Project.all 
    @todos = Todo.all 
    end 

    def update 
    end 

    def create 
    @newTodo = Todo.create(text: params[:text]) 
    @newProject = Project.find_by(title: params[:title]) 
    @newProject.todos << @todo 
    @newTodo.save 
    end 
end 

マイルートファイル ここではページのコードです。私は真剣にそれが動作するか分からない:

Rails.application.routes.draw do 
    get 'mega/index' 

    root 'mega#index' 

    get 'mega/update' 

    post 'mega/create' 

    resources :todos 
    resources :projects 

end 
+0

あなたのコンソール(あなたがあなたのサーバーを走らせている場所)でおそらくルーティングエラーを起こしているようです。フォームは通常「取得」しません。彼らは通常、「投稿する」。とにかく、あなたの質問にコンソールのテキストを追加して、何が起きているのかを確認するべきでしょう。 – jvillian

+0

私は間違いをしないようです。エラーログを見つける方法はありますか? – UsedC

+0

あなたが探しているのは、すぐにいくつかのリソースを作成するアクションを作成することです。しかし、それは高度なトピックthats本当にnoobには適していません。私は良いチュートリアルを取って、代わりにレールの慣習を理解することをお勧めします。 – max

答えて

2

あなたはPOSTリクエストでリソースを作成します。 絶対に取得しないでください。

GET要求は、偶発的である必要があります。サーバーのリソースを更新または変更しないでください。 1つの非常に重要な理由は、それらがブラウザの履歴に保存されているため、戻るボタンを押すと意図しない結果が生じることです。代わりに、あなたは正しい行動へのルートを作成するために、HTTP動詞を使用したルートのパスにアクション名を仮止めのRailsの風味MVCで

GET /things things#index 
POST /things things#create 

私はあなたをサルベージしようとするつもりはありませんコード(それは大きな欠陥だ)、その代わりに、はるかに簡単であるとして、あなたがこのレールウェイを解決する方法を説明します:

<%= form_for(Todo.new) do |f| %> 
    <h2>New todo</h2> 
    <%= f.text_field :text %> 
    <%= f.follection_select(:project_id, @projects, :id, :title, prompt: true) %> 
    <%= f.submit %> 
<% end %> 

これはtodos#createに提出する - あなたが使用することができます型破りな行動へのルートにそれをしたい場合urlオプション:

<%= form_for(Todo.new, url: polymorphic_path(controller: 'foo', action: 'bar')) do |f| %> 

しかし、あなたがそれらを壊す前にルールを学んでください。

+0

間違ったツリーを吠える2日間を費やす代わりに、[Rails Tutorial](https://www.railstutorial.org/)のようなチュートリアルから始めたいと思うかもしれません。あなたは良いアプリを書いているように自分でそれを理解することはできませんし、生産的であるということはRailsアプリケーションの構築方法を学ぶことです。 – max

関連する問題