rails form_with form_tag form_for fields ruby-on-rails resources router form-for singular

form_with - Ruby on rails: recurso singular y form_for



rails form_with action (2)

¿De dónde viene ese camino mágico?

Me llevó mucho seguimiento, pero al final descubrí que url_for determina la ruta para su modelo utilizando el método polymorphic_path definido en ActionDispatch :: Routing :: PolymorphicRoutes . polymorphic_path finalmente obtiene la ruta automática para su modelo llamando algo como:

record.class.model_name.route_key

Estoy simplificando un poco, pero esto es básicamente eso. Si tiene una matriz (por ejemplo, form_for[@order, @item] ), se llama a lo anterior en cada elemento y los resultados se unen con _ .


El método model_name en su clase proviene de ActiveRecord :: Naming .

module ActiveModel ... module Naming ... def model_name @_model_name ||= begin namespace = self.parents.detect do |n| n.respond_to?(:use_relative_model_naming?) && n.use_relative_model_naming? end ActiveModel::Name.new(self, namespace) end end end end


¿Cómo puedo cambiarlo?

Afortunadamente, ActiveModel :: Name precalcula todos los valores, incluida route_key, por lo que para anular ese valor, todo lo que tenemos que hacer es cambiar el valor de la variable de instancia.

Para el recurso :order en su pregunta:

class Order < ActiveRecord::Base model_name.instance_variable_set(:@route_key, ''order'') ... end # new.html.erb <%= form_for @order do |f| # Works with action="/order" %> ... <% end %>

¡Pruébalo!

Quiero que el usuario trabaje con solo un pedido conectado a la sesión del usuario. Así que establecí un recurso singular para ordenar

routes.rb:

resource :order

views / orders / new.html.erb:

<%= form_for @order do |f| %> ... <% end %>

Pero cuando abro la página de la nueva orden, obtengo un error:

undefined method `orders_path`

Sé que puedo establecer :url => order_path en form_for , pero ¿cuál es la verdadera forma de resolver esta colisión?


Desafortunadamente, este es un error . Tendrás que configurar la URL como mencionas.

= form_for @order, :url => orders_path do |f|