我按照Rails入门教程稍作修改(关于模型和属性的名称)但我发现使用表单部分有问题。
我的" _form.erb.html"看起来如下:
<%= form_for :company do |f| %>
<% if @company.errors.any? %>
<div id="error_explanation">
<h2>
<%= pluralize(@company.errors.count, "error") %> evitaron que la compañía se almacenara
</h2>
<ul>
<% @company.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="input">
<%= f.label :name, "Nombre" %>
<%= f.text_field :name, :required => true%>
</div>
<div class="input">
<%= f.label :handle, "Handle" %>
<%= f.text_field :handle, :required => true%>
</div>
<div class="button">
<%= f.submit "Guardar" %>
</div>
<% end %>
我的edit.html.erb看起来像这样:
<h1>Editar empresa</h1>
<hr>
<%= render 'form' %>
<%= link_to 'Regresar al listado', companies_path %>
new.html.erb看起来像这样:
<h1>Nueva empresa</h1>
<hr>
<%= render 'form' %>
<%= link_to 'Regresar al listado', companies_path %>
以前没有部分我使用以下代码作为表单标题:
new.html.erb
<%= form_for :company, url: companies_path do |f| %>
edit.html.erb
<%= form_for :company, url: company_path(@company), method: :patch do |f| %>
现在我尝试使用部分内容我得到以下异常:
No route matches [POST] "/companies/new"
Rails.root: /../app
╔═══════════════════╦══════════════════════════╦═══════════════════════════════╦═══════════════════╗
║ Helper ║ HTTP Verb ║ Path ║ Controller#Action ║
╠═══════════════════╬══════════════════════════╬═══════════════════════════════╬═══════════════════╣
║ Path / Url ║ ║ ║ ║
║ companies_path ║ GET ║ /companies(.:format) ║ companies#index ║
║ POST ║ /companies(.:format) ║ companies#create ║ ║
║ new_company_path ║ GET ║ /companies/new(.:format) ║ companies#new ║
║ edit_company_path ║ GET ║ /companies/:id/edit(.:format) ║ companies#edit ║
║ company_path ║ GET ║ /companies/:id(.:format) ║ companies#show ║
║ PATCH ║ /companies/:id(.:format) ║ companies#update ║ ║
║ PUT ║ /companies/:id(.:format) ║ companies#update ║ ║
║ DELETE ║ /companies/:id(.:format) ║ companies#destroy ║ ║
║ pages_index_path ║ GET ║ /pages/index(.:format) ║ pages#index ║
║ root_path ║ GET ║ / ║ pages#index ║
╚═══════════════════╩══════════════════════════╩═══════════════════════════════╩═══════════════════╝
关于如何使用部分的任何想法?
答案 0 :(得分:1)
成功
<%= form_for @company do |f| %>
而不是
<%= form_for :company do |f| %>
来自Getting Started with Rails指南:
除了form_for声明之外的所有内容都保持不变。该 我们可以使用这个更简单,更简单的form_for声明来表示原因 对于任何其他形式,@ article是一种资源 对应一整套RESTful路由,Rails就可以了 推断使用哪个URI和方法。
答案 1 :(得分:0)
因此,问题实际上是您使用符号作为form_for
的参数,然后手动指定所需控制器操作的路径。但是,既然您已将new.html.erb
和edit.html.erb
表单重构为单个部分(_form.html.erb
),那么它将无法正常工作。
您希望表单在新公司的情况下向post
路径提交/companies
请求,并向put
路径提交companies/:id
请求编辑现有公司的情况。相反,它正在向新操作提交post
请求。
您需要从视图中传递@company
实例变量,以便表单可以使用它:
<强> new.html.erb 强>
<h1>Nueva empresa</h1>
<hr>
<%= render 'form', company: @company %>
<%= link_to 'Regresar al listado', companies_path %>
<强> edit.html.erb 强>
<h1>Editar empresa</h1>
<hr>
<%= render 'form', company: @company %>
<%= link_to 'Regresar al listado', companies_path %>
更改您的表单代码以使用实例变量,如下所示:
<强> _form.html.erb 强>
<%= form_for @company do |f| %>
form_for
方法正在检查您作为参数提供的对象是否保持不变。如果它不是,Rails知道你想要创建动作并使提交按钮转到该动作,如果它被持久化,Rails知道你想要更新动作。
请确保首先将@company
实例变量传递给视图:
<强> CompaniesController.rb 强>
def new
@company = Company.new
end
def edit
@company = Company.find(params[:id])
end