Tengo dos modelos:

class Location < ActiveRecord::Base
    has_many :cows
    accepts_nested_attributes_for :cows
end

class Cow < ActiveRecord::Base
    belongs_to :location
end

Cada ubicación tiene una identificación y un nombre. Una vaca consta de una identificación, dos cadenas y dos fechas y también incluye un location_id.

En mi vista de vaca, tengo un menú desplegable de cada ubicación. Se actualiza automáticamente cada vez que creo, edito o elimino una ubicación. Cuando elijo una ubicación del menú desplegable, el índice de la vaca cambia en función del ajuste location_id en las vacas.

Vacas index.html.erb:

<!-- Dropdown Button -->
<a class='dropdown-button' href='#' data-activates='dropdown_locations'>
<i class="fa fa-arrow-down" aria-hidden="true"></i> Ort auswählen</a>

<!-- Dropdown Content -->
<ul id='dropdown_locations' class='dropdown-content'>
  <% @locations_all.each do |loc| %>
    <li><%= link_to loc.name, cows_path(location: loc.id) %></li>
  <% end %>
</ul>

La página de índice de vacas es una página para mostrar el contenido y agregar nuevos valores al mismo tiempo. Como mencioné, el índice cambia según la ubicación seleccionada. Pero solo funciona si relleno la tabla de vacas manualmente en un editor de base de datos, ya que la ubicación seleccionada del menú desplegable no se guardará en las vacas.

Aquí está el formulario para crear nuevas vacas en vacas index.html.erb:

<%= simple_form_for Cow.new do |f| %>
    <%= f.input :ohrmarke, as: :string, input_html: { maxlength: 5 } %>
    <%= f.input :stallnummer, as: :string, input_html: { maxlength: 3 } %>
    <%= f.hidden_field :location_id, value: @location_id %>

    <button class="btn waves-effect waves-light" type="submit" name="action">Zuordnung speichern</button>
<% end %>

Uso un hidden_field para el location_id y el valor debe ser el location_id de la ubicación seleccionada desde el cuadro desplegable.

Pero por alguna razón, crear nuevas vacas simplemente no funciona. Aquí está mi controlador de vaca (acortado):

def index
  @locations_all = Location.all
  if (params[:location] && cows = Cow.where(location_id: params[:location]))
    @cows = cows
    @location = Location.where(id: params[:location])
  else
    @cows = Cow.all
  end
end

def new
  @cow = Cow.new
end

def create
  @cow = Cow.new(cow_params)

  respond_to do |format|
    if @cow.save
      # format.html blabla... the usual stuff
    end
  end
end

private
  def set_cow
    @cow = Cow.find(params[:id])
  end

  def cow_params
    params.require(:cow).permit(:ohrmarke, :hin, :weg, :stallnummer, location_attributes: [:location_id])
  end
end

Creo que mi hidden_field o el controlador de creación no funciona. Pero no sé qué hice mal. Al menos funciona cambiar el índice en función de la ubicación seleccionada. Gracias por cualquier ayuda de antemano.


Editar : lo resolví con su ayuda y por mi cuenta, vea mi respuesta.

0
GoYoshi 29 abr. 2017 a las 00:21

3 respuestas

La mejor respuesta

Después de algunas sugerencias, cambié el código y configuré el location_id. Ahora todo funciona bien. Aquí está el nuevo código:

Controlador de la vaca:

def index
  @locations_all = Location.all
  if (params[:location] && cows = Cow.where(location_id: params[:location]))
    @cows = cows
    @location_id = params[:location] # used for the form
    @location = Location.find(@location_id) # used for ex. showing the name
  else
    @cows = Cow.all
  end
end

def cow_params
  params.require(:cow).permit(:ohrmarke, :hin, :weg, :stallnummer, :location_id)
end

Formar:

<%= f.hidden_field :location_id, value: @location_id %>

También cambié los modelos en consecuencia (moví nested_attributes a Cow).

0
GoYoshi 29 abr. 2017 a las 23:02

El problema principal es que usted ha dicho que Location accepts_nested_attributes_for for :cows, pero su formulario y su controlador están configurados como Cow accepts_nested_attributes_for :location. Creo que si cambia su modelo para que sea

class Location < ActiveRecord::Base
has_many :cows

end

class Cow < ActiveRecord::Base
    belongs_to :location
    accepts_nested_attributes_for :location
end

Deberías llegar a alguna parte.

1
ruby_newbie 28 abr. 2017 a las 21:29

No creo que estés estableciendo la ubicación

def cow_params
  params.require(:cow).permit(:ohrmarke, :hin, :weg, :stallnummer, location_attributes: [:location_id])
end

Debe ser

def cow_params
  params.require(:cow).permit(:ohrmarke, :hin, :weg, :stallnummer, :location_id)
end

La ubicación no tiene un location_id. Creo que solo quieres poner eso en la vaca.

1
Mark Swardstrom 28 abr. 2017 a las 21:55