我试图将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">×</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代码。
答案 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。
希望这可以帮到你。