Ruby on rails: unikalny zasób i forma dla
Chcę, aby użytkownik pracował tylko z jednym zamówieniem połączonym z sesją użytkownika. Więc ustawiłem pojedynczy zasób dla porządku
Trasy.rb:
resource :order
Views / orders / new.html.erb:
<%= form_for @order do |f| %>
...
<% end %>
Ale po otwarciu nowej strony zamówienia pojawia się błąd:
undefined method `orders_path`
Wiem, że mogę ustawić :url => order_path
w form_for
, ale jaki jest prawdziwy sposób rozwiązania tej kolizji?
2 answers
Niestety, to jest Błąd . Musisz ustawić adres url, jak wspominasz.
= form_for @order, :url => orders_path do |f|
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-25 15:13:05
Skąd bierze się ta magiczna ścieżka?
Zajęło mi dużo śledzenia, ale ostatecznie odkryłem, że url_for określa ścieżkę dla Twojego modelu za pomocą metody polymorphic_path
zdefiniowanej w ActionDispatch::Routing::PolymorphicRoutes . polymorphic_path
ostatecznie pobiera ścieżkę automatyczną dla Twojego modelu, wywołując coś w następujący sposób:
record.class.model_name.route_key
Trochę upraszczam, ale to jest w zasadzie to. Jeśli masz tablicę (np. form_for[@order, @item]
), powyższe jest wywoływane na każdym elemencie i wyniki są połączone z _
.
Metoda model_name
na twojej klasie pochodzi z 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
Na szczęście Activemodel::Name wstępnie oblicza wszystkie wartości łącznie z route_key, więc aby nadpisać tę wartość, wystarczy zmienić wartość zmiennej instancji.
Dla zasobu :order
w twoim pytaniu:
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 %>
Wypróbuj to!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-26 05:09:25