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
您使用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| %>
但在破解它们之前先学习规则。
而不是花两天时间咆哮错误的树,你可能想从像[Rails教程](https://www.railstutorial.org/)这样的教程开始。你不能自己想出来,因为编写好的应用程序和生产效率是关于如何构建Rails应用程序。 – max
看起来像你应该可能会在你的控制台(你正在运行你的服务器)的地方得到一个路由错误。表单通常不会“获得”。他们通常'发布'。无论如何,您应该将控台中的文本添加到您的问题中,以便我们看到发生了什么。 – jvillian
我似乎没有得到任何错误。有没有办法找到错误日志? – UsedC
如果你想要做的是创建一个动作,一次创建几个资源有轨道的方式来做到这一点。它是一个先进的主题,虽然不适合小菜鸟。我建议你先写一篇好的教程,然后先找出导轨约定。 – max