尝试编辑时,Rails form_for 结果是 POST 而不是 PUT

2024-04-25

我在用Rails 4并出现以下错误。

路由错误
没有路线匹配 [POST] "/logs/1/meals/13/edit

我使用 :meal 传递模型对象的 form_ ,并且编辑页面正确呈现。然而,Rails 似乎并没有检查膳食对象是否已经保存,因此它不断尝试将表单发送到 #create 操作,并尝试发出 POST 请求,而不是将表单发送到更新操作并进行当我点击提交时发出 PUT 请求。

如何让 form_for 识别出我正在尝试更新现有对象并且需要 PUT 而不是 POST?其他一切都正常,我已经运行了所有迁移。我对 Rails 还很陌生,我几乎花了一整天的时间试图自己解决这个问题。请帮忙!

需要注意的是,当我尝试将模型对象作为 @meal.log 而不是 :meal 传递时,Rails 不再能够识别 :calorie_estimate 或 :meal_description。将模型对象作为 @meal.log 传递给我留下了无方法错误。

膳食/edit.html.erb

<h3> EDIT MEAL </h3>
<%= form_for(:meal) do |f| %>
<div id="meal-form">
    <%= f.text_field :calorie_estimate, class: 'meal-form-fields', :placeholder => "Calorie Estimate" %>
    <%= f.text_field :meal_description, class: 'meal-form-fields', :placeholder => "Food Description" %>
  <div class="submit-form" style="width: 75px; height: 15px;">
    <%= f.submit 'UPDATE', :class => 'submit-form-text' %>
  </div>
</div>
<% end %>

餐食控制器.rb

class MealsController < ApplicationController
  include MealsHelper

  def create
    @meal = Meal.new(meal_params)
    @meal.log_id = params[:log_id]
    @meal.save

    redirect_to log_path(@meal.log)
  end

  def edit
    @meal = Meal.find(params[:id])
  end

  def update
    @meal = Meal.find(params[:id])
    @meal.update(meal_params)
    redirect_to log_path(@log)
  end

  def meal_params
    params.require(:meal).permit(:calorie_estimate, :meal_description)
  end

end

可能的路线:

Prefix Verb   URI Pattern                            Controller#Action
         root GET    /                                      logs#index
    log_meals GET    /logs/:log_id/meals(.:format)          meals#index
              POST   /logs/:log_id/meals(.:format)          meals#create
 new_log_meal GET    /logs/:log_id/meals/new(.:format)      meals#new
edit_log_meal GET    /logs/:log_id/meals/:id/edit(.:format) meals#edit
     log_meal GET    /logs/:log_id/meals/:id(.:format)      meals#show
              PATCH  /logs/:log_id/meals/:id(.:format)      meals#update
              PUT    /logs/:log_id/meals/:id(.:format)      meals#update
              DELETE /logs/:log_id/meals/:id(.:format)      meals#destroy
         logs GET    /logs(.:format)                        logs#index
              POST   /logs(.:format)                        logs#create
      new_log GET    /logs/new(.:format)                    logs#new
     edit_log GET    /logs/:id/edit(.:format)               logs#edit
          log GET    /logs/:id(.:format)                    logs#show
              PATCH  /logs/:id(.:format)                    logs#update
              PUT    /logs/:id(.:format)                    logs#update
              DELETE /logs/:id(.:format)                    logs#destroy

路线.rb

Rails.application.routes.draw do

  root to: 'logs#index'

  resources :logs do
    resources :meals
  end
end

模式.rb

ActiveRecord::Schema.define(version: 20160128205351) do

  # These are extensions that must be enabled in order to support this database
  enable_extension "plpgsql"

  create_table "logs", force: :cascade do |t|
    t.string   "entry_date"
    t.integer  "calorie_goal"
    t.string   "notes"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "meals", force: :cascade do |t|
    t.integer  "calorie_estimate"
    t.string   "meal_description"
    t.integer  "log_id"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

end

问题是你正在使用nested resources http://guides.rubyonrails.org/routing.html#nested-resources,因此你对哪个感到困惑@objects传递给你的form_for.

#app/views/meals/edit.html.erb
<%= form_for [@log, @meal] do |f| %>

正如你现在所拥有的那样,passing :meal含糊不清- Rails 无法识别将其提交发送到的路线/方法,因为它没有可用的数据。

如果你想update一个对象,您必须将适当的数据传递给表单,包括物体的id:

<%= form_for :meal, url: { controller: "meals", action: "update", id: "5" }, method: :put do |f| %>

比如 Rails 是面向对象 https://en.wikipedia.org/wiki/Object-oriented_programming,你最好将实际对象传递给你的form_for:

<%= form_for @meal ...

--

您遇到的问题是您有一个嵌套资源:

resources :logs do
  resources :meals #-> url.com/logs/:log_id/meals/:id
end

这意味着你需要通过Log and Meal http://apidock.com/rails/ActionView/Helpers/FormHelper/form_for#53-Nested-resources-in-form-for对你的价值观form:

#app/controllers/meals_controller.rb
class MealsController < ApplicationController
  def edit
     @log  = Log.find params[:log_id]
     @meal = Meal.find params[:id]
  end

  def update
     @log  = Log.find params[:log_id]
     @meal = Meal.find params[:id]   
     @meal.update meal_params     
  end
end

#app/views/meals/edit.html.erb
<%= form_for [@log, @meal] do |f| %>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试编辑时,Rails form_for 结果是 POST 而不是 PUT 的相关文章

  • 如何设置和获取Redis中存储的对象?

    我试图在 redis 中存储一个对象 当我获取该对象时 它似乎不起作用 I tried u User new u name blankman redis set test u x redis get test x name error 我想
  • 数据库被锁定?

    我如何修复数据库锁 因为我的测试没有通过 它使同一类别中的一堆测试失败 谢谢 1 UsersController GET edit should have a link to change the Gravatar Failure Erro
  • RMagick 安装无法构建本机扩展

    在 Mountain Lion 上 我尝试安装 RMagick 我找到了一个GitHub 上的问题 https github com mroth lolcommits issues 56解决方案应该是命令gem pristine rmagi
  • 哪个版本的 ruby​​ bug 较少?

    我最近编写了一些复杂的 ruby 脚本 最终会在随机时间和随机位置因段错误而失败 例如 nokogiri mechanize inov 超时 我在 Windows 7 下的 1 9 1 p 129 1 8 6 p 369 和 ubuntu
  • Rails:如何测试 lib/ 目录中的代码?

    我有一个从解析器对象获取数据的模型 我认为解析器类应该位于 lib 目录中 尽管我可以说服它应该位于其他地方 问题是 解析器类的单元测试应该在哪里 如何确保每次运行 rake 测试时都运行它们 在我正在开发的 Rails 应用程序中 我决定
  • “PG DuplicateTable:错误关系“产品”已存在”- Heroku db:迁移尝试

    Rails 菜鸟尝试将 DB 迁移到 Heroku 请原谅这个错误消息的多汁性 但我认为将其全部包含在内可能很重要 我不知道为什么会发生这种情况 也不知道这意味着什么 我的架构中只有一张产品表和一张创建产品迁移表 Migrating to
  • rspec 不适用于设计用户身份验证

    我正在尝试使用 RSpec 来测试我的 Rails 应用程序 该应用程序使用设计用户身份验证 gem 以下是已捆绑的相关 gem 的列表 devise 3 4 1 rails 4 1 7 4 1 6 rspec 3 1 0 rspec co
  • 在 Ruby 中创建 Microsoft Word (.docx) 文档

    有没有一种简单的方法可以在 Ruby 应用程序中创建 Word 文档 docx 实际上 就我而言 它是一个由 Linux 服务器提供服务的 Rails 应用程序 类似的宝石Prawn http prawn majesticseacreatu
  • HTML 表单:POST 对象数组

    提交班级名单 一次添加3名学生 每个学生都有最初 最后的年龄 问题 我们如何才能将所有学生放入数组中 students 0 gt Array first gt first name for 0 last gt last name for 0
  • 如何在rails中定义自定义路径?

    我有一个用户模型 如果我做 def my action user User new end then I get undefined method users path for
  • 如何强制send_data在浏览器中下载文件?

    好吧 我的问题是我正在使用send data on my Rails 3应用程序向用户发送文件AWS S3类似的服务 Base establish connection access key id gt my key secret acce
  • Paperclip 会自动清理文件名吗?

    我正在使用 Thoughtbot回形针宝石 https github com thoughtbot paperclip处理文件上传 我发现当我上传文件名中包含空格的文件时 它会用下划线替换空格来存储 那挺好的 我还尝试上传带有特殊字符的文件
  • 如何在 Ruby on Rails 中向 select_tag 添加类

    难以为此添加类标签 div class field div 这是我尝试过的 除其他外 div class field div
  • 在 Ruby on Rails 中渲染部分集合正在乘以项目

    我想在 Ruby on Rails 的页面中显示项目列表 我使用部分 in my index html erb我有的文件 in list news html erb I have div class news div
  • 覆盖 Rails ActiveRecord 销毁行为的最佳方法是什么?

    我有一个应用程序 我想在其中覆盖许多模型的销毁行为 用例是用户可能有删除特定记录的合法需要 但实际上从数据库中删除该行会破坏引用完整性 从而影响其他相关模型 例如 系统的用户可能想要删除不再与其有业务往来的客户 但需要维护与该客户的交易 看
  • 如何使用符号来标识 ruby​​ 方法中的参数

    我正在学习 Rails 并回到 ruby 来了解 Rails 中的方法 以及 ruby 的实际工作原理 当我看到如下方法调用时 validates first name presence gt true 我有点迷惑不解了 如何在 ruby
  • 如何让 Rails 资产管道生成源地图?

    我想让 Rails 与编译后的 CoffeeScript 缩小的 JS 一起生成源映射 以便更好地记录错误 不过 网上似乎还没有关于如何执行此操作的全面文档 有人这样做过吗 我使用 Rails 3 2 和 Heroku Rails 支持缩小
  • 使用 bcrypt-ruby 使用版本 $2y 验证哈希密码

    我们陷入了困境 需要使用 Ruby 根据现有的用户数据库对用户进行身份验证 用户的密码都是使用password compat PHP库生成的 所有散列密码均以 2y 开头 我一直在使用 bcrypt ruby 尝试对用户进行身份验证 但没有
  • 使用 Assetic PHP 通过 RVM 安装后 Sass 损坏

    我正在尝试设置 Assetic PHP 资源编译器 并且它可以与 CoffeeScript Stylus 和 Less 一起使用 所有 NPM 包都运行良好 然而 对于 Sass 我遇到了问题 以下是我到目前为止所采取的步骤 我安装了 RV
  • 如何让我的导航栏出现在 Rails 应用程序的每个页面上?

    目前 我的导航栏位于我的index htm erb 文件中 目前仅在主页上显示 我想知道为了让导航栏出现在我的应用程序的每一页上 必须采取哪些必要步骤 我的导航栏的代码如下所示

随机推荐

  • 更改 UISearchBar 的大小

    无法找到答案 也无法做我想做的事 CGSize searchBarSize self searchDisplayController searchBar frame size searchBarSize width
  • 如何使用 URLSession 从 url 获取 JSON 数据?

    我正在开发一个 iOS 应用程序 我必须从中获取数据this url https dl dropboxusercontent com s 2iodh4vg0eortkl facts json 我可以看到这个 url 包含 JSON 数据 所
  • Android FloatingActionButton 带有片段和底部导航栏

    我正在创建一个具有以下结构的 Android 应用程序 主要活动有一个底部导航栏 可在 3 个不同的片段之间切换 其中 2 个片段将显示项目列表 并使用浮动操作按钮 FAB 添加新项目 第三个片段将显示不同的内容 不需要 FAB 基于此 F
  • 使用 gradle 进行简单的 protobuf 编译

    如果您正在寻找示例 gradle protobuf 项目 请查看here https github com google protobuf gradle plugin tree master examples exampleProject
  • “没有路线匹配”错误?

    我是新的 Rspec 刚刚开始在 Rails 3 上生成一个新的控制器 它默认生成一些 Rspec 测试 我有一个关于如何让它们通过的问题 就目前情况而言 我在我的终端中看到了这个测试 1 BuildingsController GET s
  • 将数据写入文本文件

    我有一个简单的程序 将 7 个数字中的 6 个写入文本文件 从逻辑上讲 一切似乎都很好 但是 数字并未按预期写入文件 Random random new Random Console WriteLine Please enter the n
  • 将 json 数据 objectForKey 分配给类的属性的替代语法

    我可以将最后三行代码写在一行中吗 NSArray latestLoans self JsonData objectForKey loans for id object in latestLoans NSDictionary loan obj
  • 使用 Testcafe 访问 OpenVPN 限制的网站

    有一个网站只有在运行 OpenVPN Connect 2 1 3 111 配置文件时才能访问 我需要使用 Testcafe 访问该网站 但到目前为止我还没有找到任何有关使用 Testcafe 与 VPN 的文档 有什么我可能错过的吗 测试通
  • git clone 永远挂在 github 上

    当我按照 github 中的第 5 点 测试所有内容 时guide http help github com linux set up git ssh 命令也永远挂起 根据该指南 我应该看到一条消息 Github 不提供 shell 访问
  • Python 使 UMAP 更快(呃)

    我正在使用 UMAP https umap learn readthedocs io en latest https umap learn readthedocs io en latest 以减少数据的维度 我的数据集包含 4700 个样本
  • Math.min.apply 对于 null 返回 0

    我想从数组中获取最小值 如果数据包含null value Math min apply回报0 for null价值 请参见这个 JSFiddle 示例 http jsfiddle net jeryslo 7DCXw 即使数组中存在空值 如何
  • 使用 DirectSound 向后读取声音

    是否可以使用 DirectSound 的托管版本向后读取声音 如果没有 是否有另一个库可以轻松实现 您可以使用 WaveFileReader 和 WaveFileWriter 类NAudio http www codeplex com na
  • 如何在 python-docx 中将页面大小更改为 A4

    我尝试使用 python docx 创建 Word 文档 创建的文件的字母尺寸为 8 5 x 11 英寸 但在德国 标准格式是 A4 8 27 x 11 69 英寸 from docx import Document from docx s
  • 从工作线程 C# CF 在主线程中抛出事件

    我有 可能是 一个简单的问题 我正在使用互操作来调用 CompactFramework 中的异步函数 获得执行结果后 我想引发一个事件 该事件将被表单捕获 并根据结果 我将在屏幕上呈现一些数据 然而 问题是 当互操作函数返回结果时 它会在工
  • 找出数组中重复的元素

    有一个大小为 n 的数组 数组中包含的元素在 1 到 n 1 之间 每个元素出现一次 只有一个元素出现多次 我们需要找到这个元素 尽管这是一个非常常见的常见问题解答 但我仍然没有找到正确的答案 大多数建议是我应该将数组中的所有元素相加 然后
  • 在 Swift 中将 Int 更改为 CGFloat 以返回 heightForRowAtIndexPath tableview 函数

    我确信我错过了一些非常简单的东西 但我就是无法让它发挥作用 我会尽力更好地解释我正在做的事情 以帮助其他遇到同样问题的人 这是我的职能 func tableView tableView UITableView heightForRowAtI
  • 更新数据库时 LiveData 列表不更新

    我目前正在重构遗留代码以使用 Android 架构组件 并在一种存储库模式中设置房间数据库和齐射请求 因此 表示 域层要求存储库获取 LiveData Objects 来观察或告诉他与服务器同步 然后删除旧的数据库条目并从服务器重新获取所有
  • Dockerfile FROM 与 Docker-compose IMAGE

    我目前正在学习Docker 阅读文档和几篇文章后 我显然有更多的问题而不是答案 目前对我来说最有趣的是 FROM some docker image 在 Dockerfile 和 image digitalocean com php 在 d
  • Windows 操作系统中无法访问的 IP 套接字关闭时间

    这些代码通过用户数据报协议提供发送数据 下面有两个代码 当我使用第一个代码来处理无法访问的 IP 地址时 我得到了三秒的延迟 请查看新结果标题 只需打开新的 C 控制台应用程序并将这些代码粘贴到其中 第一个代码 using System u
  • 尝试编辑时,Rails form_for 结果是 POST 而不是 PUT

    我在用Rails 4并出现以下错误 路由错误没有路线匹配 POST logs 1 meals 13 edit 我使用 meal 传递模型对象的 form 并且编辑页面正确呈现 然而 Rails 似乎并没有检查膳食对象是否已经保存 因此它不断