Я использую рельсы 4.2. Я создал форму, которая подчиняется определенному действию в моем контроллере. Вот начало кода формы и определения контроллера:Странное поведение маршрутизации в рельсах
view.html.erb
<div id="account-booking" class="tab-pane">
<%= form_for @booking_info, url: { action: 'book' } do |b| %>
<fieldset class="group column-1">
<legend>Booking Preference for <%= Rails.configuration.x.app_settings.year %></legend>
<div class="group column-full radio-list">
<%= label_tag('Select Room Type') %>
<% @available_rooms.each do |rt| %>
<div class="radio-item">
<!--
<%= b.radio_button :room_type_id, rt.id, :class => 'rb_room_type inline', :onclick => fetch_room_info_path(:id => rt.id), :remote => true %>
<%= b.radio_button :room_type_id, rt.id, :class => 'rb_room_type inline', :onclick => 'render_room_info('+ rt.id.to_s + ');' %>
-->
<%= b.radio_button :room_type_id, rt.id, :class => 'rb_room_type inline' %>
<%= content_tag :span, rt.name %>
<a data-toggle="tooltip" data-placement="right" title="<%= rt.description %>">
<%= image_tag "tooltip.png", :class=>"tooltip-icon" %>
</a>
</div>
<% end %>
<%= b.label :roommate_preference, 'Roommate Preference' %>
<%= b.text_area :roommate_preference, :class => 'form-control' %>
<div class="account-checkbox-options">
<%= b.label :is_flexible, class: 'checkbox inline' do %>
<%= b.check_box :is_flexible %>
I am flexible with regards to my room choice.
<% end %>
</div>
</div>
<!--
<div id="estimated-due" class="group column-2">
</div>
-->
</fieldset>
<fieldset class="group column-2 account-preferences">
<legend>Your Room Information for <%= Rails.configuration.x.app_settings.year %></legend>
<div class="group column-1">
<div class="group column-full add-tabbing">
<%= label_tag('Selected Room:') %>
<span><%= @booking_info.room_type.blank? ? '<No Room Selected>' : @booking_info.room_type.name %></span>
</div>
<div class="group column-full add-tabbing">
<%= label_tag('Assigned Room:') %>
<span><%= @booking_info.assigned_type.blank? ? '<No Room Assigned>' : @booking_info.assigned_type.name %></span>
</div>
</div>
<div class="group column-2">
<div class="group column-full add-tabbing">
<%= label_tag('Total Due:') %>
<span ><%= number_to_currency(@booking_info.total_due.blank? ? 0.00 : @booking_info.total_due) %></span>
</div>
<div class="group column-full add-tabbing">
<%= label_tag('Current Balance:') %>
<span><%= number_to_currency(@booking_info.outstanding_balance.blank? ? 0.00 : @booking_info.outstanding_balance) %></span>
</div>
</div>
<% unless @booking_info.assigned_type.blank? %>
<div class="group column-full">
<h2>Assigned Room Information</h2>
</div>
<% end %>
</fieldset>
<div class="account-buttons">
<%= b.submit 'Submit', class: 'btn btn-danger' %>
<%= link_to 'Cancel', '/pages/home', class: 'link-button-cancel' %>
</div>
<% end %>
</div>
account_controller.rb
def book
@booking = PersonRoom.new(booking_params)
@requested_room = RoomType.find(params[:person_room][:room_type_id])
@booking.room_type = @requested_room
if update_booking @booking
redirect_to :controller => 'account', :action => 'view'
else
render('view')
end
end
Все это прекрасно работает, когда нет записи PersonRoom (например, если я делаю вставку). Однако, если я попытаюсь обновить запись, используя ту же самую точную форму/действие (потому что и представление, и действие абсолютно одинаковы независимо от того, вставляю ли я или обновляю), я получаю сообщение об ошибке, когда я нажимаю «Отправить», :
нет маршрута матчей [PATCH] "/ счет/книга"
Это не имеет никакого смысла. Я на той же странице. Я просто использовал весь этот код для создания записи, поэтому маршрут явно существует (потому что он вызывает/account/book). Теперь я хочу обновить, но вдруг маршрут не соответствует? И он даже не врывается в код, потому что он не вызывает действие контроллера. Это имеет для меня смысл. Надеюсь, кто-то может помочь.
Предоставляете ли вы идентификатор вместе с запросом при обновлении организация? – Makoto
Каков ваш файл routes.rb? Обновление не работает из-за типа запроса (PATCH), возможно, не из-за чего-либо еще. –