" _form.erb.html"部分不适用于创建和更新表单代码生成

时间:2015-05-04 03:00:59

标签: ruby-on-rails ruby

我按照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       ║
╚═══════════════════╩══════════════════════════╩═══════════════════════════════╩═══════════════════╝

关于如何使用部分的任何想法?

2 个答案:

答案 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.erbedit.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