【问题标题】:How do rails forms work without a model?没有模型,rails 表单如何工作?
【发布时间】:2018-03-22 19:28:52
【问题描述】:

我试图通过使用 Rails 表单创建一个简单的项目来挑战我的学习,但是我真的陷入困境并且无法找到任何似乎可以在线帮助的信息。

我想要做什么:

我想创建一个没有模型的 Rails 应用程序(因此没有数据持久性)。简单地说,我希望用户输入一个 Soundcloud URL,然后将其传输到控制器,在那里我可以执行更多逻辑。本质上,我真的想了解 Rails 表单和 rails 中的控制器之间的联系。我花了一整天时间阅读有关 HTML 表单的内容,以及在谷歌上搜索这个确切的问题,但并没有完全理解它。

我知道有不同的表单助手,但我似乎无法理解的是如何在没有模型的情况下使用它们。我现在最大的问题是我无法将表单值传输到控制器。我以为我了解 RESTful 路由、PUT/GET 等。但这让我非常沮丧,因为我似乎无法理解这一点。任何建议都非常感谢。

代码:

下面是我正在努力解决的具体代码,目前当我提交表单时它崩溃了,给我一个基于路线的错误,这就是我卡住的地方。

问题代码在视图中的_form.html.erb文件中找到:

<%= form_tag '/show' do %>
  <%= label_tag(:soundcloud_url, "Please enter a valid Soundcloud Artist URL:") %>
  <%= text_field_tag(:soundcloud_url) %>
  <%= submit_tag("Let's go!") %>
<% end %>

Routes.rb:

Rails.application.routes.draw do
  resources :soundcloud_query

  root 'soundcloud_query#index'

  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end

错误:

Routing Error
No route matches [POST] "/show"

rake 路由输出:

                Prefix Verb   URI Pattern                          Controller#Action
soundcloud_query_index GET    /soundcloud_query(.:format)          soundcloud_query#index
                       POST   /soundcloud_query(.:format)          soundcloud_query#create
  new_soundcloud_query GET    /soundcloud_query/new(.:format)      soundcloud_query#new
 edit_soundcloud_query GET    /soundcloud_query/:id/edit(.:format) soundcloud_query#edit
      soundcloud_query GET    /soundcloud_query/:id(.:format)      soundcloud_query#show
                       PATCH  /soundcloud_query/:id(.:format)      soundcloud_query#update
                       PUT    /soundcloud_query/:id(.:format)      soundcloud_query#update
                       DELETE /soundcloud_query/:id(.:format)      soundcloud_query#destroy
                  root GET    /                                    soundcloud_query#index

Github 链接:

https://github.com/gaelant/simple_soundcloud_app/commit/09c4c4df524bb721a0f472b4378cd8c1ff18177f

注意:我知道这是一个基本问题,但我对此感到非常困惑。我知道上面代码的编写方式是不正确的,但是我尝试了很多不同的东西,我就是不明白发生了什么,或者如果没有模型,这是否可能。

【问题讨论】:

  • 请将您的整个错误和routes.rb 的相关部分(因为您显然遇到了路由错误)添加到您的问题中。
  • 抱歉,添加了请求的详细信息。
  • 获取正确的路由url使用调用rails routes
  • 哦,对了。表单执行 post 并且您正在尝试使用 /show 网址。如果您在控制台中执行rake routes,您将看到您没有post :show 的路由。你是/create 网址将接受post
  • 你好!所以我试着把 create 放进去,但我得到了这个:没有路由匹配 [POST] "/create" 要查看我的 rake 路由的详细输出,我把它放在上面的问题中

标签: ruby-on-rails


【解决方案1】:

您的/show 表单操作毫无意义。 rails routes 向您显示哪个 url 是有效的,以及它们每个人都指向哪个 controller#action

正确的表单操作应该是

<%= form_tag '/soundcloud_query' do %>
  <%= label_tag(:soundcloud_url, "Please enter a valid Soundcloud Artist URL:") %>
  <%= text_field_tag(:soundcloud_url) %>
  <%= submit_tag("Let's go!") %>
<% end %>

更好的方法是使用您在 Routes.rb 中定义的资源提供的 url_helpers

这样做您的表单操作将如下所示

<%= form_tag soundcloud_query_index_path do %>
  <%= label_tag(:soundcloud_url, "Please enter a valid Soundcloud Artist URL:") %>
  <%= text_field_tag(:soundcloud_url) %>
  <%= submit_tag("Let's go!") %>
<% end %>

硬编码和基于 url_helper 的解决方案会将您的请求路由到名为 SoundcloudQuery 的控制器类,其中将调用操作 create。您必须在此操作中放入所有需要的逻辑。

也可以定义/show 应该指向一个特定的控制器和动作。这看起来像这样。

post '/show', to: 'mycontroller#myaction', as: 'mypathnameforhelper'

可以在这个非常好的指南中找到更多关于路线以及如何使用它们的示例的更好解释。

Rails Routing from the Outside In

提示:您应该遵守 ROR 命名约定。控制器应该有复数名称。所以你应该像这样定义你的路线:

Rails.application.routes.draw do
  ressources :soundcloud_queries

  root 'soundcloud_queries#index'
end

然后将控制器类和文件相应地重命名为SoundcloudQueriessoundcloud_queries.rb。但这不是强制性的。

【讨论】:

  • 嘿Tekkla!哇,这对我帮助很大。我现在已经让它工作了(并将我的控制器重命名为 DOH ......感谢您指出这一点)。我仍然特别对这条线感到困惑(它让一切都为我工作):&lt;%= form_tag soundcloud_queries_path do %&gt;。如果我理解正确,它将向 soundcloud_queries 控制器路径发出 POST 请求。其中隐含的是“rails magic”,它已经知道在控制器内寻找创建操作?我只是很困惑,我指定的很少,但实际上以这种特定的方式发生了多少。
  • 顺便说一句,我会将其标记为已回答。感谢您抽出时间Tekkla。另外,我已经阅读了 rails 路由链接,但遗憾的是,我认为它并没有真正帮助我理解路由,因为我读过它 - 这是有道理的 - 但后来我去应用一些东西,我留下了很多问题。您是否知道任何其他可以推荐的更深入地了解 Rails 路由的好资源?如果没有,不用担心,我可以谷歌搜索它 - 只是想我会问主人:)
  • Rails 从 Routes.rb 中定义的资源创建助手/方法。看看这个stackoverflow.com/questions/24622826/…
  • 非常感谢Tekkla。这真的很有帮助。我希望你有一个愉快的周末,并且知道你今天在你的帮助下让别人的生活变得更好:)
【解决方案2】:

我认为在这种情况下,您不应该使用 form_tag 中的 url,而是使用控制器操作。 假设您在 soundcloud_controller.rb 中有一个名为 my_form.html.erb 的视图和一个 submit_form 方法

def submit_form
  params[:soundcloud_url] your logic
end

我会这样设置路线:

get 'soundcloud_query' => 'soundcloud_query#my_form'  // didn't want to use 'resources' but it doesn't matter
post 'soundcloud_query' => 'soundcloud_query#submit_form'

然后表单将如下所示:

<%= form_for :this_doesnt_matter, action: :submit_form do |f| %>
 <%= f.text_field :soundcloud_url %>
 <%= f.submit %>
<% end %>

【讨论】:

  • 非常感谢您的回答,迈克!我有点困惑。您是否将#my_form 定义为操作?另外,当你发出这样的 post 请求时,rails 路由器如何知道你点击提交时要转到哪个页面?
  • 当你点击提交时,你不会直接进入页面,你需要在你的控制器中定义一个重定向,通常是 redirect_to :back - 留在当前页面 my_form 是你的表单的视图- soundcloud_query 文件夹中的 my_form.html.erb 以清除可能:在这样设置的路由中,“get”将视图(my_form)作为“参数”,“post”采用控制器方法(submit_form)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
相关资源
最近更新 更多