2017-10-07 49 views
1

我是Ruby和Rails的真正新手,我一直在尋找兩天的解決方案。我需要從form_tag提交數據到''創建'在我的控制器中添加新的條目到數據庫,但看起來我正在做一些非常錯誤的事情,因爲絕對沒有任何反應,似乎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

如果你想要做的是創建一個動作,一次創建幾個資源有軌道的方式來做到這一點。它是一個先進的主題,雖然不適合小菜鳥。我建議你先寫一篇好的教程,然後先找出導軌約定。 – max

回答

2

您使用POST請求創建資源。 永遠不要GET。

GET請求應該是冪等的 - 它們不應該更新或更改服務器上的資源。一個非常重要的原因是它們存儲在瀏覽器歷史記錄中,所以按下後退按鈕會對用戶造成意想不到的後果。

在Rails的MVC的味道,而不是使用HTTP動詞來創建路由到正確的行動路線的道路上固定該動作名稱:

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

而不是花兩天時間咆哮錯誤的樹,你可能想從像[Rails教程](https://www.railstutorial.org/)這樣的教程開始。你不能自己想出來,因爲編寫好的應用程序和生產效率是關於如何構建Rails應用程序。 – max

相關問題