#ruby-on-rails #ruby-on-rails-3 #model-view-controller
#ruby-on-rails #ruby-on-rails-3 #модель-вид-контроллер
Вопрос:
Я новичок в rails, однако довольно хорошо знаком с «обычным» программированием на MVC, таким как Spring и .net. Я пытаюсь справиться со всем этим новым способом выполнения работы, но я продолжаю застревать — особенно когда дело доходит до рендеринга / обновления одного и того же представления с разными данными, основанными на выборе, сделанном пользователем.
На самом деле все это действительно просто, и я вижу, что об этом спрашивали много раз — хотя, кажется, я не могу найти какой-либо определенный ответ и «это способ rails сделать это».
Все, что я хочу сделать, это примерно так:
База данных «схема», с таблицами a, b, c и ссылками на них:
C -> A
C -> B
Основываясь на выборе B в выпадающем списке, я хочу показать все «Cs A» — не обращайте внимания на часть запроса, это прямолинейно. К настоящему моменту я выбираю первый B в качестве «первого рендеринга» страницы в моем контроллере, но когда пользователь выбирает другой B в выпадающем списке, представление должно быть повторно отображено на основе выбора…
Я не хочу использовать пользовательское заполнение javascript или какой-либо другой «странный» способ. У меня должна быть возможность выбрать что-то и обновить представление на основе выбора в RoR.
Я надеюсь, что вы либо сможете мне помочь, либо укажете мне правильное направление.
Спасибо!
Ответ №1:
Поместите все эти списки выбора в форму и в событие ‘onchange’ списков добавьте javascript, который отправляет форму ($(‘form_name’).submit()). Как только вы отправите форму, у вас будут все выбранные значения в виде параметров (параметры [:select_list_1], параметры [:select_list_2]). Обработайте их по своему усмотрению, запустите запросы и снова отобразите представление.
Вы могли бы отправить форму для того же действия. Действие было бы примерно таким:
def index
if !request.post?
# Generate default values
else
# Generate new resultset based on params
end
end
РЕДАКТИРОВАТЬ (пример формы): форма может быть добавлена как и: url указывает действие элемента формы:
<%= form_for(:select_list_form, :url => {:controller => "my_controller", :action => "index"}) do |f| %>
<!-- Your select list here -->
<%= f.submit "Continue", :class => "form-button form-left" %>
<% end %>
<!-- Render data based on your instance variables -->
Комментарии:
1. Конечно, нет! -Просто еще не заставили это работать: P Не могли бы вы, пожалуйста, показать еще немного кода? Я могу заставить форму правильно отправить.. Если я отправлю его, он пожалуется, что у меня нет метода create — я знаю его стандартный crud, но мне не нужно ничего создавать здесь… У меня есть тег select внутри form_tag action => my_action.
2. И, кстати, это единственное поле выбора, которое обновляет таблицу данных на основе выбора 🙂
3. Итак, у меня получилось! Но действительно ли это может быть правдой, что отправка формы всегда пытается вызвать действие create? Как избежать этого …??
4. Нет. Форма вызывает указанное вами действие. Взгляните на редактирование. Я добавляю общую форму. Если вы добавляете форму в модель, вы можете улучшить ее. Полную ссылку можно найти здесь: api.rubyonrails.org/classes/ActionView/Helpers /…
5. Что ж, я думаю, что сейчас мы становимся еще ближе — однако, я попробовал это и заблудился в представлениях, необходимых для выполнения этого действия. Поскольку я хочу только повторно отобразить текущее представление. Вот так: пользователь получает index.erb.html , для чего вызывается действие index. Это заполняет коллекцию на основе значения «по умолчанию». Пользователь изменяет что-либо в выпадающем списке, значение «по умолчанию» перезаписывается выбранным значением, данные извлекаются из базы данных (хранятся в той же переменной экземпляра, которая используется в индексном действии) Тот же вид отображается снова, с новыми данными. При указании действия запрашивается представление этого имени?
Ответ №2:
Я сам столкнулся с этой проблемой, и самый чистый способ, который я нашел, — использовать это :
Он вызывает ajax-запрос при изменении списка выбора. Затем вам нужно настроить новое действие в вашем контроллере, например load_related :
def load_related
@childreen = Model.where(....)
render :update do |page|
page.replace 'div id where you whant stuff to appear', :partial => '...'
end
end
Это ваш первый ajax-запрос в Rails. Для документации :