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|