【问题标题】:ruby on rails 5.2 --"form for" couldn't updateruby on rails 5.2 --“form for”无法更新
【发布时间】:2018-05-06 15:03:38
【问题描述】:

我使用 form_for 创建了一个表单,它可以创建但不能更新这样的代码:

def create
  @message=Message.new(message_params)
  if @message.save
    redirect_to root_path
  else
    render 'new'
  end
end

def edit
    @message=Message.find(params[:id])
end

def update
    @message=Message.find(params[:id])
    if @message.update(message_params)
        redirect_to message_path(@message)
    else
        render 'edit'
    end
end

我每一步都按照教程进行,他们可以做到,但我做不到。它总是显示:

 No route matches [POST] "/message/4/edit" 

我不知道为什么它不能直接更新路径? 谢谢

路线:

resources :message

表单视图:

<h1>Edit</h1>
<%= form_for :message do |a| %>
<p>
<%= a.label :name %><br>
<%= a.text_field :name %>
</p>

<p>
 <%= a.label :description %><br>
 <%= a.text_area :description %>
</p>
<%=a.submit "update"%>
<% end %>

【问题讨论】:

  • 请添加 routes.rb 中的代码和您的表单代码
  • 我的表格如上。一些教程说 Rails 将通过单击相同的提交按钮知道何时使用 post 或 patch。他们说如果rails在模型中找不到记录,它将使用“post”来创建;但是当它在模型中找到旧记录时,它会使用“patch or put”自动更新。是对的吗?谢谢。
  • @JuniorChung 在你的routes.rb 中是复数resources :messages
  • @sovalina,这有关系吗?我不太确定,我以为它只是一个名字,它可以是任何名字,对吧?
  • @JuniorChung 如果您想将message 资源作为单数使用,请使用resource 方法单数:resource :message。我与您分享answer here,它很好地解释了单数和复数资源之间的区别。混合命名资源单复数问题也解决了here

标签: ruby-on-rails-5 updates form-for


【解决方案1】:

我的猜测是您认为您的表单有问题。

如果您查看resources :messagesroutes.rb 中创建的内容:

您可以看到控制器操作update 不应该是 POST 方法 - 它应该是 PATCH 或 PUT。

我会推荐阅读this great article Rails Routing from the Outside In - 当你读完之后,我敢打赌你可以弄清楚你的表格出了什么问题。

祝你好运

【讨论】:

  • 谢谢彼得,我也对此感到困惑。我使用相同的表单创建,单击提交按钮后,它可以发布到模型;但是当我用它更新时,它没有使用 Patch 或 put 方法,但我在 youtube 上找到了教程,他们也是这样做的,它可以使用 patch 或 put 自动更新。我不确定是版本问题还是其他问题。
【解决方案2】:

你在评论中写道:“一些教程说rails会知道何时使用post或patch,只需点击相同的提交按钮。他们说如果rails在模型中找不到记录,它将使用“post”创建;但是当它在模型中找到旧记录时,它会使用“patch or put”自动更新”。

这是正确的。

但是 Rails 需要知道要更新哪条记录(例如记录 ID)。您在表单中有&lt;%= form_for :message do |a| %&gt;。这里没有关于要更新哪条记录的信息。应该是

<%= form_for @message do |a| %>

注意 @- 这是来自控制器编辑操作 @message = Message.find(params[:id]) 的实例变量,这是带有 id 的特定消息。

如果您使用它,您只能为创建和更新操作编写一个表单,它将自动工作 - 只需从新/编辑操作中获取 @message。

您可以在guides阅读更多相关信息

【讨论】:

  • 感谢 Vasilisa,我已经通过使用这里的长样式解决了这个问题:
【解决方案3】:

我通过使用长样式解决了它,但是短样式仍然不起作用,我不知道。无论如何,非常感谢你们。

## Creating a new article
# long-style:
form_for(@article, url: articles_path)
# same thing, short-style (record identification gets used):
form_for(@article)

## Editing an existing article
# long-style:
form_for(@article, url: article_path(@article), html: {method: 
"patch"})
# short-style:
form_for(@article)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 2014-04-14
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    相关资源
    最近更新 更多