Перенаправление на «показ» представления модели объекта при поиске по атрибутам (NOT id) - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть форма, где пользователи ищут конкретный счет по некоторым атрибутам этого счета, а именно «Номер конгресса», «Тип счета» и «Номер счета», как в 114-HR-67.Я хочу «показать» соответствующий счет, но для этого я должен получить соответствующую модель счета в отдельном действии, которое я назвал «find_by_attributes».Внутри этого действия я выполняю:

@bill = Bill.find_by( params ).first

, который корректно получает соответствующий идентификатор счета.

Теперь я просто хочу перенаправить на метод "показа" этого счета, как в URL

".../bills/[@bill.id]"

На данный момент в конце моего действия "find_by_attributes" я делаю

redirect_to bills_path(@bill)

, который корректно загружает show.html.erb с @bill, но не изменяетсяURL-адрес (URL-адрес по-прежнему показывает действие «find_by_attributes», за которым следует длинная строка запроса вместо чистой »/bills/[:bill_id]".

Как я могу реструктурировать свой код для достиженияаккуратный редирект, который я желаю?

Полный код ниже:

ФОРМА

<%= form_tag("bills/find_or_create", :method => :get ) do |f| %>
  <%# render 'shared/error_messages', object: f.object %>
  <%= fields_for :bill do |ff| %>
    <%= ff.label :congress, 'Congress (i.e. 114)' %>
    <%= ff.number_field :congress, class: 'form-control' %>

    <%= ff.select :bill_type, options_for_select(
        [['House of Representatives', 'hr'],
         ['Senate', 's'],
         ['House Joint Resolution', 'hjres'],
         ['Senate Joint Resolution', 'sjres'],
         ['House Concurrent Resolution', 'hconres'],
         ['Senate Concurrent Resolution', 'sconres'],
         ['House Resolution', 'hres'],
         ['Senate Resolution', 'sres']]
        )
    %>

    <%= ff.label :bill_number, 'Bill number (i.e. 67)' %>
    <%= ff.number_field :bill_number, class: 'form-control' %>
  <% end %>
  <%= submit_tag "Submit", class: "btn btn-primary" %>
<% end %>

ДЕЙСТВИЯ КОНТРОЛЛЕРА

  def find_by_attributes
    @bill = Bill.where(bill_params).first_or_create(bill_attributes)
    redirect_to bills_path(@bill)
  end

  def show
    puts bill_params
    if params[:bill]
      @bill = Bill.where(bill_params).first_or_create do |bill|
        bill.attributes = bill_attributes
      end
    else
      @bill = Bill.find(params[:id])
    end
    @subjects = Subject.where("bill_id = ?", @bill[:id])
    @bill_comments = Comment.where("target = ?", @bill[:id])
  end

ФАЙЛ МАРШРУТОВ

...
  resources :bills do
    get :find_by_attributes
  end
...

РЕДАКТИРОВАТЬ

Я использую драгоценный камень turbolinks в моем приложении рельсов.

1 Ответ

0 голосов
/ 12 сентября 2018

я вижу здесь то, что вы звоните

redirect_to bills_path(@bill)

что в теории это не путь показа, вам просто нужно удалить "s"

redirect_to bill_path(@bill)

и в качестве дополнительного комментария в этой строке вам не нужна первая часть, поскольку find_b находит первую запись, соответствующую указанным условиям, вы можете удалить эту часть.

@bill = Bill.find_by( params )
...