@man_without_face
студент

Как построить структуру контроллеров у однотипных страниц?

Делаю сайт для нефтяного техникума. Они хотят 30 страниц с формулами, но с возможностью вычисления. Т.е. страница должна содержать описание, картинку формулы и калькулятор с сабмитом.

Это на rails, поэтому вот думаю, как это можно организовать? Можно сделать 30 контролеров, в каждом будет 2 метода (show, calc) и две страницы. Но тогда будет сложно редактировать.

Окей, если каждая страница - это запись в БД, то как добавлять совершенно разную логику на страницы и в контролер? Плодить сабмит-методы? Тоже не хорошо.

Может есть у кого какие варианты? Было бы там 5 формул, то я бы не морочался, а просто сделал бы полу-статичные страницы. Но 30... А если ещё захотят? Брр...

Вот кстати пример: https://mirurokov.ru/калькулятор-онлайн/калькулято...

Т.е. это обычный калькулятор процентов. А теперь представьте, что у вас много таких калькуляторов, вычисления проходят на сервере (т.е. не js), а результат разного вида (таблица, график, просто число).
  • Вопрос задан
  • 95 просмотров
Решения вопроса 4
@notwrite
придумать формат хранения формулы, чтоб удобно парсить в калькулятор. День потерять и за 5 минуть долететь
Ответ написан
oh_shi
@oh_shi
Один контроллер show, который принимает параметром id вьюхи. Соответственно под каждую формулу своя вьюха с текстом, формой и js (или с уникальным id по которому дергать нужный скрипт) для расчета формулы на клиенте.
Ответ написан
Можно сделать 30 контролеров, в каждом будет 2 метода (show, calc) и две страницы.
Ни в коем случае так не делать!
Можно хранить контент вопросов в виде шаблона Liquid (рендеринг на стороне сервера) или шаблона с рендерингом на стороне браузера (Riot.js, Vue.js, React.js, ...):

В базе данных хранить записи модели QuizQuestion:
  • question (string)
  • annotation (string)
  • html_template (string)
  • calc_params (json?)


Общий для всех вопросов шаблон (erb) - partial
<h1 class="header"><%= quiz_question.question %></h1>
<span class="annotation"><%= quiz_question.annotation %><span>
<div class="content"><%= raw content %></div>
<button>Показать/рассчитать</button>

<% @quiz_questions.find_each do |quiz_question| %>
<%
content = Liquid::Template.parse(quiz_question.html_template)
# content.render( 'name' => 'vasya', 'age' => 25 ) 
%>
<%= render partial: 'quiz_template', locals: {quiz_question: quiz_question, content: content} %>
<% end %>
Вместо raw безопаснее таки использовать sanitize, указав белый список разрешенных тегов.
В контроллере при показе вопроса компилировать шаблон на основе имеющихся данных (calc_params) в целевой HTML.
Как-то так.

Для отображения на 1-й странице 30 вопросов использовать
def index
  @quiz_questions = QuizQuestion.limit(30).offset(0)
end
Ответ написан
@man_without_face Автор вопроса
студент
В общем решил. Каждая формула в БД имеет описание, код и название. При показе информации о формуле, просто делаем рендер нужного кода, который в отдельном шаблоне:

<%= render partial: 'calcs/' + @formula.code, locals: { params: params } %>


В итоге в show:
@result = Calc.new.fetch(code, params)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы