【问题标题】:Rails form posting to /new instead of /create?Rails 表单发布到 /new 而不是 /create?
【发布时间】:2012-04-16 20:04:15
【问题描述】:

我有一个使用 Rails 3.1.x 应用程序的简单表单视图:

<%= form_for(:mymodel) do |f| %>
  <% if @mymodel.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@mymodel.errors.count, "error") %> prohibited this model from being saved:</h2>

      <ul>
      <% @mymodel.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    Amount:
    <%= f.text_field :count %><br /><br />
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

点击此处提交时,它会发布到/mymodels/new。如何强制它为 mymodels_controller.rb 执行正确的创建操作?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    选项 1: 遵循约定并向 form_for 助手提供新的未保存记录。您可能已经在@mymodel 上有这样的对象,设置在您的控制器的new 操作上。所以下面的 sn-p 应该可以很好地工作:

    <%= form_for(@mymodel) do |f| %>
    

    如果它不起作用,您可以像这样在您的操作上设置@mymodel

    class MyModelsController
      def new
        @mymodel = MyModel.new
      end
    end
    

    选项 2:明确说明您的 URL 和方法:

    <%= form_for(:mymodel, :url => create_mymodel_path, :method => :post) do |f| %>
    

    【讨论】:

    • 我可以用@mymodel 解决这个问题,但值得注意的是@mymodel 应该在控制器中设置。所以它在控制器中看起来像def new @mymodel = MyModel.new() end,然后在视图中看起来像&lt;%= form_for @mymodel do |f|。这现在将提交给该控制器的/create
    • +1 感谢您提供解决此问题的正确方法。互联网上的其他人似乎都认为在routes.rb 中使用match 或类似名称是解决方案。我寻找了一个真正的解决方案,你已经给出了它。您可能希望扩展您的答案以包含我之前评论的信息,因为You probably already have an initialized empty object on @mymodel 不会告诉他们如何做,如果他们还没有,我的评论可能会被忽略并且没有用换行符格式化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    相关资源
    最近更新 更多