Так что для вашего маршрута, :id
присутствует, верно?Вот почему вы должны указать идентификатор при создании маршрута.
Вы можете перезаписать маршрут, чтобы он не содержал :id
, или установить :id
как необязательный (использовать (:id)
, а затем добавитьВаш идентификатор в качестве параметра для отправки.
Однако я раньше не использовал remote_function: D
===== ОБНОВЛЕНИЕ =====
Так что яна самом деле я не знаком с remote_function, поскольку я редко использую встроенный прототип, но jquery.
Похоже, вы предоставляете список идентификаторов города для выбора, а затем передаете идентификатор серверу, чтобы получить город,и отобразите его на странице.
Ниже приведен только пример, который может не подходить для вашего случая:
Определите маршрут:
map.ajax_show_city "/cities/:id", :controller => "cities", :action => "show"
В CitiesController
def show
@city = City.find(params[:id])
respond_to do |format|
format.html #if you don't like, you could delete this line
format.js # auto call cities/show.js.erb
end
end
В городах / show.js.erb
jQuery("#the_place_you_want").append("<%= javascript_escape(render(:partial=>@city)) %>");
Для рендеринга использовался city / _city.html.erb для предоставления html-кода города
<%= select_tag "cities", cities_options(with_id_as_the_option_value), :onchange => "show_city(this, '#{url_for(ajax_show_city_path)}')" %>
# This will generate something like:
<select name="cities" id="cities" onchange="show_city(this, '/cities')"> # note the path generated
<option value="1">City 1</option>
<option value="2">City 2</option>
</select>
Требуется функция js:
function show_city(select, link) { # sorry for using jQuery
$.post(link + "/" + retrieve_option_value(select), "", null, "script");
# $.post(link_to_post, addintional_data, handling_function_after_success, request_type)
# This would post to /cities/2 with no any params added.
# Due the the request type being set to script, the returned data would be treated as javascript and executed. So no handling function is needed (that's why null)
}
function retrieve_option_value(select) {
$(select).children(":selected").val(); # just get the selected option's value
}
Вот и все.
Так что, если js выключен, пользователь все равно может нажать кнопку отправки(используйте js, чтобы скрыть или отсоединить кнопку) и получите правильный результат!Добавление js - это просто добавление более причудливых вещей.Конечно, я согласен, что почти все не отключат поддержку js.Но это доступ к отключениям.
=====
Довольно сложно, что для show path ресурса кажется, что вы должны предоставить id
для генерации пути безошибка.
вы можете проверить маршруты:
map.connect "/test", :controller => "cities", :action => "test" # for test only
map.resources :cities
map.other "/cities/show/:id", :controller => "cities", :action => "show", :method => :get
def test
render :text => url_for(city_path) # ambiguous routes error
render :text => url_for(city_path(0) # gives /cities/0
render :text => url_for(other_path) # gives /cities
render :text => url_for(other_path(0)) # gives /cities/0
end
Обходной путь для вашего пути - сгенерировать /cities/0
и во время выполнения использовать js для замены 0
на выбранный вами идентификатор.