Solucionado (ver solução)
Solucionado
(ver solução)
9
respostas

Dúvida em: Customizando as camadas MVC para exibir jobs premium

PessoALL,

Depois de criar o Partial "_car.html.erb" e alterar a view para reenderizar o formulário, a página retorna o erro:

undefined local variable or method `car' for #<#<Class:0x007fa4838c5530>:0x007fa4861bb1d8>
Extracted source (around line #3): <% if car.premium %>

Segue o código: Da Partial _car.html.erb:

<h3>
    <%= car.title %>
    <% if car.premium %>
    <strong>(premium)</strong>
    <% end %>
</h3>

<%= simple_format car.description %>

<p> 
          <%= link_to 'Show', car %> |
        <%= link_to 'Edit', edit_car_path(car) %> |
        <%= link_to 'Destroy', car, method: :delete, data: { confirm: 'Are you sure?' } %>
</p>

Da view premium.html.erb:

<h1>Premium cars</h1>

<%= render 'car' %>

<br>

<%= link_to 'New Car', new_car_path %>

</br>

<%= link_to 'Sobre o Site', site_about_path %>
<%= link_to 'Todos os Carros', cars_path %>

Estou usando este exemplo pois comecei meu projeto com o exercício de "Carros Usados" e não de "Jobs", porém segui construindo o projeto de acordo com os exercícios.

Não consegui encontrar o porque que está ocorrendo este erro. Alguém tem uma explicação/solução?

Obrigado e abraço.

9 respostas

Camilo,

Ao invés de:

<%= render 'car' %>

Coloque:

<%= render @cars %>
solução!

Complementando:

Dessa forma, o próprio Rails chama a partial _car.html.erb por causa da convenção. Ele já detecta que foi chamada uma lista de carros e chama a partial com o nome no singular.

Oi Joviane,

Tentei fazer isso também, porém retorna o mesmo erro.

=(

Como está o código do seu controller?

Oi Joviane,

Segue:

class CarsController < ApplicationController
  before_action :set_car, only: [:show, :edit, :update, :destroy]

  # GET /cars
  # GET /cars.json
  def index
    @cars = Car.all
  end

  def premium
    @cars = Car.where(premium: true).all
  end

  # GET /cars/1
  # GET /cars/1.json
  def show
  end

  # GET /cars/new
  def new
    @car = Car.new
  end

  # GET /cars/1/edit
  def edit
  end

  # POST /cars
  # POST /cars.json
  def create
    @car = Car.new(car_params)

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

  # PATCH/PUT /cars/1
  # PATCH/PUT /cars/1.json
  def update
    respond_to do |format|
      if @car.update(car_params)
        format.html { redirect_to @car, notice: 'Car was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: 'edit' }
        format.json { render json: @car.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /cars/1
  # DELETE /cars/1.json
  def destroy
    @car.destroy
    respond_to do |format|
      format.html { redirect_to cars_url }
      format.json { head :no_content }
    end
  end

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

    # Never trust parameters from the scary internet, only allow the white list through.
    def car_params
      params.require(:car).permit(:brand, :model, :year, :premium)
    end
end

Só lembrando, estou usando o Rails 4, não o 3.

Como está sua classe: Car ou Cars ? Você pode mostrar o código ?

Oi Wendel!

Segue abaixo:

class CarsController < ApplicationController
  before_action :set_car, only: [:show, :edit, :update, :destroy]

  # GET /cars
  # GET /cars.json
  def index
    @cars = Car.all
  end

  def premium
    @cars = Car.where(premium: true).all
  end

  # GET /cars/1
  # GET /cars/1.json
  def show
  end

  # GET /cars/new
  def new
    @car = Car.new
  end

  # GET /cars/1/edit
  def edit
  end

  # POST /cars
  # POST /cars.json
  def create
    @car = Car.new(car_params)

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

  # PATCH/PUT /cars/1
  # PATCH/PUT /cars/1.json
  def update
    respond_to do |format|
      if @car.update(car_params)
        format.html { redirect_to @car, notice: 'Car was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: 'edit' }
        format.json { render json: @car.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /cars/1
  # DELETE /cars/1.json
  def destroy
    @car.destroy
    respond_to do |format|
      format.html { redirect_to cars_url }
      format.json { head :no_content }
    end
  end

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

    # Never trust parameters from the scary internet, only allow the white list through.
    def car_params
      params.require(:car).permit(:brand, :model, :year, :premium)
    end
end

Seguinte Camilo, além do view você alterou manualmente o nome do controller? Caso tenha feito isso vc atualizou sua chamada de rotas ? Vou testar essa alteração que você realizou e ver se ocorre o mesmo erro