Rails 4.0.4自定义form_for路由

时间:2014-04-01 09:57:39

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

我试图将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=>"update", :controller=>"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 最初我在bootstrap模式中有这样的形式,如下所示:

<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代码。

1 个答案:

答案 0 :(得分:1)

您实际上不需要在form_for中指定网址。 如果未指定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创建操作
  • 如果@key不是新记录(@key.new_record?返回false),则属于您的情况:

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

可以找到更多信息here

希望这可以帮到你。