2017-02-20 3 views
0

У меня есть приложение 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

+2

Опубликовать форму и полный журнал –

+0

Это может быть ошибка в вашем представлении, или ваш контроллер, или ваш файл маршрутов. Очень сложно отладить вербальное описание вашего кода. Можете ли вы изменить свой вопрос и показать нам соответствующий фрагмент для каждого из этих файлов, чтобы мы могли определить, что это такое. –

ответ

0

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

1

Вы не в ваших маршрутов в backups_search_path, поэтому он обрабатывает search в строке запроса в качестве id и таким образом делая show.html.erb, поэтому попробуйте

get 'backups/search' => 'backups#search', as: :backups_search 
+0

Тимми, я думаю, это хорошая вещь, чтобы проверить. У меня есть «get» backups/search '=>' backups # search '"в routes.rb, но для других людей, которые ищут помощь при маршрутизации, это хорошая вещь, чтобы ее проверить. –

Смежные вопросы