D'où vient ce chemin magique ?
Cela m'a pris beaucoup de temps, mais j'ai fini par découvrir que l'url_for détermine le chemin d'accès à votre modèle en utilisant l'attribut polymorphic_path
définie dans ActionDispatch::Routing::PolymorphicRoutes . polymorphic_path
obtient finalement le chemin automatique pour votre modèle en appelant quelque chose du genre :
record.class.model_name.route_key
Je simplifie un peu, mais c'est en gros ce qu'il faut faire. Si vous avez un tableau (par ex. form_for[@order, @item]
), l'opération ci-dessus est appelée sur chaque élément et les résultats sont joints à l'aide de la commande _
.
Le site model_name
de votre classe provient de ActiveRecord::Nommage .
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
Comment puis-je le changer ?
Heureusement, ActiveModel::Nom précalcule toutes les valeurs, y compris route_key, donc pour remplacer cette valeur, il suffit de changer la valeur de la variable d'instance.
Pour le :order
ressource dans votre question :
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 %>
Essayez-le !
0 votes
Je ne suis pas sûr de comprendre pourquoi vous n'utilisez pas le singulier pour vos ressources.
0 votes
Parce que le guide des rails conseille d'utiliser la forme plurielle de contrôleur. Mais dans la forme singulière de contrôleur existe le même bug...
0 votes
Si vous avez juste une ressource singulière imbriquée qui vous pose problème, vous pouvez utiliser
form_for [@user, :subscription, @payment]
pour générer des chemins pouruser_subscription_payment_path(@user, @payment)
avec des chemins commeaction="/users/21/subscription/payments/29"
.