Rails 5.如何从form_tag提交到自定义操作?

问题描述:

我是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

您使用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