Как изменить метод в контроллере при нажатии кнопки? - PullRequest
0 голосов
/ 05 мая 2019

У меня на сайте есть карты, карты, которые должны появляться при нажатии кнопки «США», и карты, которые должны появляться при нажатии кнопки «Европа». Я закодировал все, кроме последней части. Если я введу это в свой метод индекса контроллера, подойдут только карты США:

def index
  @foods = Food.usa
end

И если я введу это:

def index
  @foods = Food.europe
end

всплывают только карты Европы. Я хочу быть в состоянии сделать это простым нажатием кнопки на моем сайте. как я это сделал?

Код моих кнопок

<div class="btn-group btn-group-toggle" data-toggle="buttons">
  <label class="btn btn-primary active">
    <input type="radio" name="options" id="europe" autocomplete="off" checked> Europe
  </label>
  <label class="btn btn-primary">
    <input type="radio" name="options" id="usa" autocomplete="off"> USA
  </label>
</div>

Имя моего контроллера: foods_controller.rb

Спасибо за помощь.

Ответы [ 2 ]

2 голосов
/ 05 мая 2019

Вы можете отправить параметр вашему контроллеру со значением радиокнопки, которое будет usa или europe

Затем вы можете использовать метод send для динамического вызова usa или europe на вашей Food модели.

Например, вы отправили параметр food_name из внешнего интерфейса на ваш контроллер.

Ваш код будет выглядеть примерно так

def index
  @foods = Food.send(params[:food_type].to_sym)
end

Но будьте осторожны при непосредственном использовании параметров, поступающих от пользователя, поскольку это может повредить ваше приложение.

A Безопасный подход заключается в создании массива возможных типов пищи в вашем контроллере.

Примерно так:

SUPPORTED_FOOD_TYPES = ["usa", "europe"].freeze

Тогда в вашем контроллере вы сделаете это так

def index
  @foods = Food.send(food_type.to_sym)
end


def food_type
  if SUPPORTED_FOOD_TYPES.include? params[:food_type]
    params[:food_type]
  else
    'all'
  end
end

Ваш HTML-код будет выглядеть так:

<%= form_tag(foods_path, method: "get") do %>
  <div class="btn-group btn-group-toggle" data-toggle="buttons">
    <label class="btn btn-primary active">
      <input type="radio" name="food_type" value="europe" id="europe" autocomplete="off" checked> Europe
    </label>
    <label class="btn btn-primary">
      <input type="radio" name="food_type" value="usa" id="usa" autocomplete="off"> USA
    </label>
  </div>
  <input type="submit" value="Apply">
<% end %>
0 голосов
/ 05 мая 2019

Вы, вероятно, захотите передать область действия модели продукта как параметр запроса, так что-то вроде этого в вашем контроллере:

def index
  if params[:food_type].present?
    @foods = Food.send(params[:food_type].to_sym)
  else
    @foods = Food.all # fallback to something or all?
  end
end

Не видя остальной части кода завершения вашего шрифта, есть несколько способов справиться с этим. Скорее всего, вы загрузите представление без данных, а затем при нажатии кнопки отправите запрос ajax с food_type в качестве параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...