【问题标题】:Rails 4.0.4 custom form_for routeRails 4.0.4 自定义 form_for 路由
【发布时间】:2014-04-01 09:57:39
【问题描述】:

我正在尝试将 form_for 映射到特定的控制器和操作。我在路线中有resources: apikey。我发现的所有解决方案似乎都不起作用。表单放置在父文件夹名称与正确控制器不对应的视图中。这是我的表格,我的解决方案不起作用:

<%= form_for @key, url: { controller: :apikey, action: :update }, remote: true do |f| %>
  <%= f.label :userkey, "Key" %>
  <%= f.text_field :userkey %>
  <%= f.submit "Update" %>
<% end %>

这是我的控制器:

class ApikeyController < ApplicationController
  def index
  end

  def update
    respond_to do |format|
      if @key.update(apikey_params)
        format.js
      else
        format.html { render action: 'edit' }
      end
    end
  end

  private

  def apikey_params
    params.require(:apikey).permit(:userkey)
  end

end

这是我在控制台中得到的日志:

Started GET "/accounts?utf8=%E2%9C%93&_method=patch&apikey%5Buserkey%5D=thekey&commit=Update" 

如您所见,它调用的不是 apikey,而是帐户控制器。我做错了什么?

更新

有点奇怪,因为我没有真正改变任何东西,现在打开网站时出现这个错误:

No route matches {:action=&gt;"update", :controller=&gt;"apikey"}

这是我的rake routes

 apikey_index GET    /apikey(.:format)            apikey#index
              POST   /apikey(.:format)            apikey#create
   new_apikey GET    /apikey/new(.:format)        apikey#new
  edit_apikey GET    /apikey/:id/edit(.:format)   apikey#edit
       apikey GET    /apikey/:id(.:format)        apikey#show
              PATCH  /apikey/:id(.:format)        apikey#update
              PUT    /apikey/:id(.:format)        apikey#update
              DELETE /apikey/:id(.:format)        apikey#destroy

更新 2 最初我在引导模式中有表单,如下所示:

<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
        <h4 class="modal-title" id="myModalLabel">Change API key</h4>
      </div>
      <div class="modal-body">

        <form role="form">
          <div class="form-group">

            <%= form_for @key, method: "post", remote: true do |f| %>
                <%= f.label :userkey, "Key" %>
                <%= f.text_field :userkey, class:"form-control", id:"apikeyinputfield" %>
                <%= f.submit "Update", class: "btn btn-success btn-sm" %>
            <% end %>

          </div>
        </form>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        <button type="button" id="submitnewapikey" data-dismiss="modal" class="btn btn-primary">Save changes</button>


      </div>
    </div>
  </div>
</div>

如果我删除了周围的模态,表单会自动映射到正确的控制器和动作。当被模态包围时,情况并非如此。真的很奇怪。也许模态的 JS 代码弄乱了 form_for JS 代码。

【问题讨论】:

    标签: ruby-on-rails routing form-for


    【解决方案1】:

    您实际上不需要在 form_for 中指定 url。 如果没有指定 url,form_for 会根据解析到的 @key 自动识别哪个控制器和方法,无论表单位于哪个视图。

    <%= form_for @key, remote: true do |f| %>
      <%= f.label :userkey, "Key" %>
      <%= f.text_field :userkey %>
      <%= f.submit "Update" %>
    <% end %>
    

    上面的代码可以有以下结果:

    • 如果@key 是新记录(@key.new_record? 返回true):

      • 表单会将请求发送到ApikeyController create action
    • 如果@key 不是新记录(@key.new_record? 返回false),您的情况就是:

      • 表单会将请求发送到ApikeyController更新操作

    更多信息可以在here找到。

    希望对你有帮助。

    【讨论】:

    • 感谢您的回答(以及很好的解释)。如果我没有指定我开始使用的任何路线,它会给我以下错误:ActionController::RoutingError (No route matches [POST] "/apikey/1") 注意:我应该提到我最初有一个围绕表单的引导模式。当模态仍然存在时,路由根本没有映射到 apikey 控制器。删除模式后,表单映射到正确的控制器。但是还是有这个错误。
    • 对,由于某种原因,没有 POST 更新操作。一个快速的解决方法是将method: :patch 添加为form_for 的参数之一。您可以指定任何 HTTP 动词 (:get|:post|:patch|:put|:delete) 作为方法。
    • 它有效,最后一个错误是我这边的错字。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    相关资源
    最近更新 更多