Как мне начать каждый цикл только после того, как я нажму кнопку «Отправить» в Rails? - PullRequest
0 голосов
/ 26 января 2019

У меня есть приложение Rails, которое просматривает БД и возвращает элементы.На данный момент, на мой взгляд, он автоматически возвращает результаты поиска по умолчанию ("") без необходимости нажатия на мой submit_tag.Как мне выполнить это действие только после того, как я нажму на submit_tag?Любая помощь будет принята с благодарностью!

Вот мой взгляд:

 <%= form_tag(new_design_path, method: :get) do %>
    <%= label_tag(:q, "Search all designs:") %>
    <%= text_field_tag(:q) %>
    <%= submit_tag("Search") %>
  <% end %><br>
  <!-- Button to return one random design --> 
  <%= form_tag(new_design_path, method: :get) do %>
    <%= label_tag(:q, "Inspire me! Click here for a random design:") %>
    <%= submit_tag("Random Design") %>
  <% end %>

  <h2>Search results:</h2>

  <% @random.each do |design| %>  
    <h3><%= design['name'] %></h3>
    <h5><%= image_tag design['thumbnail_url'] %></h5>
  <% end %>

  <% @search.each do |design| %>  
  <div class="design">
    <h3 class="design_name"><%= design['name'] %></h3>
    <h5><%= image_tag design['thumbnail_url'] %></h5>
    <%= button_to 'Save to Favourites',
      designs_path(
        design: design.slice('name', 'thumbnail_url') 
      ),method: :post %>
    </div>
  <% end %>

И мой контроллер:

class DesignsController < ApplicationController
    def index
        @designs = Design.all.order("created_at DESC")
    end

    def new
        # returns an array of hashes
        @search = SpoonflowerApi.new.find(params[:q])['results']
        @random = SpoonflowerApi.new.random(rand(1..740579), 1)['results']
    end

    def create
    @design = Design.new(design_params)
    @design.save
        if @design.save
            flash[:notice] = 'Design has been added to favourites!'
        else
            flash[:notice] = 'Design already in Favourites!'
    end
    redirect_to new_design_path
  end

  def destroy
    @design = Design.find(params[:id])
    @design.destroy
    flash[:notice] = 'Design removed from favourites!'
    redirect_to designs_path
  end

  private

  def design_params
    params.require(:design).permit(:name, :thumbnail_url) 
  end
end

Ответы [ 2 ]

0 голосов
/ 26 января 2019

new используется для заполнения начальной формы, поэтому, если вы не хотите ничего для этих полей, вы должны просто установить и @search, и @random в пустой массив в новом. Вы не показываете код для своей модели, поэтому не совсем понятно, что такое Api.

show следует позвонить после отправки формы

def new
  @search = []
  @random = []
end

затем переместите логику для предоставления результатов поиска или случайной записи в метод show

def show
  # not sure what you want to do here
  # since it seems like you have 2 buttons you need logic to provide data 
  # based on the button 
  # maybe something like this
  if params[:q].nil?
    @search = []
    @random = Api.new.random(rand(1..740579), 1)['results']
  else
    @search = Api.new.find(params[:q])['results']
    @random = []
  end
end
0 голосов
/ 26 января 2019

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

Поскольку вы напрямую отправляете параметры [: q] в SpoonflowerApi, я предполагаю, что он возвращает какое-то значение по умолчанию, и ваш взгляд его рисует.

Просто обновите ваш контроллер до:

def new
    @search=[]

    @search = SpoonflowerApi.new.find(params[:q])['results'] unless params[:q].nil?
    @random = SpoonflowerApi.new.random(rand(1..740579), 1)['results']
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...