Rails - 即使定义了方法,也存在NoMethodError

时间:2017-10-25 15:14:27

标签: ruby-on-rails

因此,我使用此方法的目标是将其链接到customers / 1 / showcar,类似于它将如何链接到customers / 1 / edit,这就是我尝试为我的代码建模的方式。

我的控制器是

class CustomersController < ApplicationController
  before_action :set_customer, only: [:show, :edit, :update, :destroy, :showcar]

  # GET /customers
  # GET /customers.json
  def index
    @customers = Customer.all
  end

  # GET /customers/1
  # GET /customers/1.json
  def show
  end
  # GET /customers/1/showcar
  def showcar
  end

  # GET /customers/new
  def new
    @customer = Customer.new
  end

  # GET /customers/1/edit
  def edit
  end

  # POST /customers
  # POST /customers.json
  def create
    @customer = Customer.new(customer_params)

    respond_to do |format|
      if @customer.save
        format.html { redirect_to @customer, notice: 'Customer was successfully created.' }
        format.json { render :show, status: :created, location: @customer }
      else
        format.html { render :new }
        format.json { render json: @customer.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /customers/1
  # PATCH/PUT /customers/1.json
  def update
    respond_to do |format|
      if @customer.update(customer_params)
        format.html { redirect_to @customer, notice: 'Customer was successfully updated.' }
        format.json { render :show, status: :ok, location: @customer }
      else
        format.html { render :edit }
        format.json { render json: @customer.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /customers/1
  # DELETE /customers/1.json
  def destroy
    @customer.destroy
    respond_to do |format|
      format.html { redirect_to customers_url, notice: 'Customer was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_customer
      @customer = Customer.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def customer_params
      params.require(:customer).permit(:cust_id, :cust_fname, :cust_lname, :cust_phone, :cust_addr, :cust_date)
    end
end

和我试图调用该方法的html.erb文件是

<style>
th, td{
  padding-left: 20px;
}
</style>

<p id="notice"><%= notice %></p>

<h1>Customers</h1>

<table>
  <thead>
    <tr>
      <th>Cust ID</th>
      <th>Cust fname</th>
      <th>Cust lname</th>
      <th>Cust phone</th>
      <th>Cust addr</th>
      <th>Cust date</th>
      <th colspan="3"></th>
    </tr>
  </thead>

  <tbody>
    <% @customers.each do |customer| %>
      <% belongstocust = Car.where(cust_id: customer.cust_id) %>
      <tr> 
        <td><%= customer.cust_id %></td>
        <td><%= customer.cust_fname %></td>
        <td><%= customer.cust_lname %></td>
        <td><%= customer.cust_phone %></td>
        <td><%= customer.cust_addr %></td>
        <td><%= customer.cust_date %></td>
        <td><%= link_to 'Show', customer %></td>
        <td><%= link_to 'Edit', edit_customer_path(customer) %></td>
        <td><%= link_to 'Destroy', customer, method: :delete, data: { confirm: 'Are you sure?' } %></td>
        #placeholder, not permanent code
        <% i = '' %>
        <% belongstocust.each do |car| %>
          <% i = car.car_model %>
          <td><%= link_to 'Show ' + i, car_path(car) %></td>
        <% end %>
        <td><%= link_to 'Show Car', showcar_customer_path(customer) %> </td> 
      </tr>
    <% end %>
  </tbody>
</table>

<br>

<%= link_to 'New Customer', new_customer_path %>
<br>
<%= link_to 'Home', home_index_path %>

问题是,每当我有代码<td><%= link_to 'Show Car', showcar_customer_path(customer) %> </td>时,即使方法是在控制器内部定义的,我也会得到noMethodError,它看起来与def show和def edit完全相同。我尝试制作一个名为customer的控制器,并将showcar方法添加到该控制器,并且它有效,但它不会通过客户。我也尝试将showcar添加到customer.rb,但它也给了我一个noMethodError。对于ruby来说,我是一个完整的菜鸟,只是被告知使用框架制作一个项目,所以我一直在学习。这可能是一个非常简单的问题,由于我的无知,我不知道如何解决,所以如果是这样的话,我很抱歉。

1 个答案:

答案 0 :(得分:0)

  

即使在控制器

中定义了方法,我也会得到noMethodError

没有。您已定义showcar,而非showcar_customer_path。你错过了一条路线,即定义xxx_path方法的东西。

config/routes.rb你可能有

resources :customers

要注册此新操作,您可以执行

resources :customers do
  member do
    get :showcar
  end
end

现在可以在视图中使用showcar_customer_path