У меня есть приложение rails, которое не маршрутизируется, как я ожидал. Метод поиска в контроллере - это показное шоу. Я сократил код до минимальных компонентов, и я размещаю их здесь, как было предложено.Что контролирует сопоставление метода контроллера Rails с просмотренным представлением?
Rails.application.routes.draw do
resources :backups
get 'backups/search' => 'backups#search'
resources :components
resources :backup_media
end
class Component < ActiveRecord::Base
has_many :backups
has_many :backup_media, :through => :backups
end
class BackupMedium < ActiveRecord::Base
has_many :backups
has_many :components, :through => :backups
end
class Backup < ActiveRecord::Base
belongs_to :component
belongs_to :backup_medium
# value to match either the name of the component or backup_medium
def self.search(value)
tables = "backups, components, backup_media"
joins = "backups.backup_medium_id = backup_media.id and components.id = backups.component_id"
c = find_by_sql "select * from #{tables} where components.name like '%#{value}%' and #{joins}"
b = find_by_sql "select * from #{tables} where backup_media.name like '%#{value}%' and #{joins}"
c.count > 0 ? c : b
end
end
class BackupsController < ApplicationController
def search
@backups = Backup.search(params[:search])
render 'index'
end
def index
@backups = Backup.all
end
def show
# this would normally be the code to show an individual backup
# but I'm re-using the code from index because the routing is broken
@backups = Backup.all
end
end
просмотров/подпорки/_search.html.erb
<%= form_tag backups_search_path, :method => 'get' do %>
<%= label_tag(:search, "Search for:") %>
<%= text_field_tag :search, params[:search], {:placeholder => 'Component or Media' }%>
<%= submit_tag "Search", :name => nil %>
<% end %>
просмотров/подпорки/index.html.erb
<h1>Listing Backups</h1>
<p id="notice"><%= notice %></p>
<%= render :partial => 'search' %>
<table>
<tr>
<th>id</th>
<th>component_id</th>
<th>backup_medium_id</th>
</tr>
<% @backups.each do |backup| %>
<tr>
<td><%= backup.id %></td>
<td><%= backup.component.name %></td>
<td><%= backup.backup_medium.name %></td>
</tr>
<% end %>
</table>
просмотров/подпорки/show.html.erb копируется from index.html.erb, так как он неправильно принимает результаты поиска
<h1>Show Backup</h1>
<p id="notice"><%= notice %></p>
<%= render :partial => 'search' %>
<table>
<tr>
<th>id</th>
<th>component_id</th>
<th>backup_medium_id</th>
</tr>
<% @backups.each do |backup| %>
<tr>
<td><%= backup.id %></td>
<td><%= backup.component.name %></td>
<td><%= backup.backup_medium.name %></td>
</tr>
<% end %>
</table>
Предложения по улучшению метода поиска будут приветствоваться.
Как уже упоминалось выше, после того, как поиск выполняется, show.html.erb визуализируется вместо search.html.erb
Для рабочей демонстрации (с более кодовыми благодаря предложениям здесь) см https://github.com/pamh09/rails-search-demo
Опубликовать форму и полный журнал –
Это может быть ошибка в вашем представлении, или ваш контроллер, или ваш файл маршрутов. Очень сложно отладить вербальное описание вашего кода. Можете ли вы изменить свой вопрос и показать нам соответствующий фрагмент для каждого из этих файлов, чтобы мы могли определить, что это такое. –