路由以显示操作而不是自定义操作

时间:2017-04-10 13:04:59

标签: ruby-on-rails ruby routes slug

news_controller.rb

 class NewsController < ApplicationController
    before_action :set_news, only: [:show]
    before_action :authenticate_user!, except: [:show, :index ]
    def index

    @news = News.where( state: true ).paginate(:page => params[:page],  :per_page => 12).order('id DESC')

    end

    def new

      @news = News.new


    end

     def show
     @news_photos = @news.news_photos
     end


      def create
        @news = News.new(news_params)
        if @news.save
          if params[:images]
            params[:images].each do |image|
              @news.news_photos.create(image: image)
            end
          end

          @news_photos = @news.news_photos
          redirect_to edit_news_path(@news), notice: "Saved..."
        else
          render :new
        end
      end

      def destroy
        @news = News.find(params[:id])
        @news.destroy

        respond_to do |format|
          format.html { redirect_to news_index_path }
         # format.json { head :no_content }
       end
     end

     def search
        @news = News.search(params[:search])
    end



    private
      def set_news
        @news = News.find(params[:id])
      end 

    def news_params
        params.require(:news).permit( :title, :description, :category, :keywords, :user_id, :email, :user_name)
    end
    end

news.rb

     class News < ApplicationRecord
     extend FriendlyId
       friendly_id :slug_candidates, use: [:slugged, :finders, :history]

         def slug_candidates 
         [ :title,
         [:title, :id]
          ] 
         end
        def self.search(search)
        pg_search_scope :search_full_text, 
                :against => :full_text, 
                :using => { :tsearch => { :prefix => true  }  }
                end 
             end

index.html.erb

        <div class="fh5co-box">
            <h3 class="heading">Search</h3>
            <%= form_tag(look_path, :method => "get") do %>
           <%= text_field_tag :search, params[:search], placeholder: "Search news" %>
            <%= submit_tag "Search" %>
             <% end %>
        </div>
    </div>
</div>

的routes.rb

      resources :news, :except => [ :search]
      get 'news/search'  => 'news#search', :as => 'look'

当我在搜索字段中提交数据时,它将路由到show动作而不是搜索操作。

路线是

 ews_index GET      /news(.:format)                              news#index
                                  POST     /news(.:format)                              news#create
                         new_news GET      /news/new(.:format)                          news#new
                        edit_news GET      /news/:id/edit(.:format)                     news#edit
                             news GET      /news/:id(.:format)                          news#show
                                  PATCH    /news/:id(.:format)                          news#update
                                  PUT      /news/:id(.:format)                          news#update
                                  DELETE   /news/:id(.:format)                          news#destroy
                             look GET      /news/search(.:format)                       news#search

日志:

     Started GET "/news/search?utf8=%E2%9C%93&search=tax&commit=Search" for 183.83.117.57 at 2017-04-10 07:36:13 -0500
        Processing by NewsController#show as HTML
          Parameters: {"utf8"=>"▒~\~S", "search"=>"tax", "commit"=>"Search", "id"=>"search"}
          ^[[1m^[[36mNews Load (0.5ms)^[[0m  ^[[1m^[[34mSELECT  "news".* FROM "news" WHERE "news"."slug" = $1 ORDER BY "news"."id" ASC LIMIT $2^[[0m  [["slug", "search"], ["LIMIT", 1]]
          ^[[1m^[[36mNews Load (0.7ms)^[[0m  ^[[1m^[[34mSELECT  "news".* FROM "news" INNER JOIN "friendly_id_slugs" ON "friendly_id_slugs"."sluggable_id" = "news"."id" AND "friendly_id_slugs"."sluggable_type" = $1 WHERE ("friendly_id_slugs"."sluggable_type" = 'News' AND "friendly_id_slugs"."slug" = 'search') ORDER BY "friendly_id_slugs"."id" DESC LIMIT $2^[[0m  [["sluggable_type", "News"], ["LIMIT", 1]]
        Completed 404 Not Found in 5ms (ActiveRecord: 1.2ms)



        ActiveRecord::RecordNotFound (can't find record with friendly id: "search"):

        app/controllers/news_controller.rb:111:in `set_news'

不知道我哪里出错了。这与slu ??? ????

有什么关系

任何帮助都非常感谢。谢谢你提前!!!

1 个答案:

答案 0 :(得分:2)

路线按顺序搜索。

换句话说,您显示的操作符合get /news/(:id)请求和您的系统进程SHOW。移动线:

  get 'news/search'  => 'news#search', :as => 'look'

在路由文件中更高,它应该可以正常工作,请记住,这会阻止search被用作id / slug。

是一条更清洁的路线
  get '/search/news'  => 'news#search', :as => 'look'

因为它超出news范围而且你不会与新闻模式发生冲突。