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?

Author: petRUShka, 2010-09-17

2 answers

Niestety, to jest Błąd . Musisz ustawić adres url, jak wspominasz.

= form_for @order, :url => orders_path do |f|
 60
Author: mckeed,
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


Jak mogę to zmienić?

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!

 52
Author: jshkol,
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