我尝试提交表单但遇到了错误
没有路线匹配[PATCH]
我已经看到有关此错误的各种帖子但是在每个帖子中他们只在其路线中设置了get
或者出现了一些错误。我提交其他几乎相同的路由和表单结构的表单也没有问题。
首先,Security has_many :stockholders
我的表格如下(位置:views/stockholders/edit.html.erb
):
<%= simple_form_for @stockholder, url: url_for{action:'update', controller:"stockholders"}, html: {id:"stockholderform"}, update: { success: "response", failure: "error"} do |f| %>
<div class="container">
<div class="symegrid">
<div class="form-inline">
<%= f.grouped_collection_select :entity_id, [Org, Person], :all, :model_name, :to_global_id, lambda {|org_or_person_object| org_or_person_object.instance_of? Org? rescue org_or_person_object.fname + " " + org_or_person_object.lname rescue org_or_person_object.name}, label:"Stockholder", class: "names"%>
</div>
<div class="form-inline">
<%= f.input :cert_number, label:"Certificate Number" %>
<%= f.input :issue_date, Label: "Issue Date" %>
</div>
</div>
<div class="submit_button">
<%= f.submit %>
</div>
</div>
<% end %>
我的控制器是:
class StockholdersController < ApplicationController
def edit
@stockholder=Stockholder.find(params[:id])
@security=Security.find(params[:security_id])
@company=@security.company
end
def update
@stockholder=Stockholder.find(params[:id])
@security=Security.find(params[:security_id])
@company=@security.company
if @stockholder.update(stockholder_params)
redirect_to edit_security_path(@security)
else
redirect_to edit_security_stockholder_path
end
end
private
def stockholder_params
params.require(:stockholder).perimit(:id, :entity_id, :cert_number, :issue_date, :shares_issued, :shares_repurchased, :shares_canceled, :shares_outstanding)
end
end
最后,我的路线是:
resources :securities do
resources :stockholders
end
有谁能帮我理解这里发生了什么?我用这种方式构建了两个模型,并没有遇到问题。
非常感谢提前
答案 0 :(得分:2)
您的路线需要另外两个参数,即:security_id
和:id
。
simple_form_for @stockholder, url: { action: 'update', controller: "stockholders", security_id: @security.id, id: @stockholder.id }, ...
如果@security
未在控制器中实例化,则@stockholder.security
可能为simple_form_for [@security, @stockholder], ... # url parameter is not needed
。
或者你可以更优雅地做到这一点:
invalid_chars = r"\~!#$%^&*()_+{}:;"
for char in email:
if char in invalid_chars:
# fail the test
pass