2016-09-28 2 views
1

После the correction of a wrong syntax у меня есть новая ошибка, и я не уверен, где это происходит от:rails4 - уродливы формат строки

категории были созданы в консоли

Category Load (2.0ms) SELECT "categories".* FROM "categories" 
=> #<ActiveRecord::Relation [#<Category id: 1, name: "Ruby", created_at: "2016-09-26 09:03:17", updated_at: "2016-09-26 09:03:17">, #<Category id: 2, name: "Rails4", created_at: "2016-09-26 09:03:25", updated_at: "2016-09-27 14:32:39">, #<Category id: 3, name: "Rails5", created_at: "2016-09-26 09:03:30", updated_at: "2016-09-27 14:35:25">, #<Category id: 4, name: "Heroku", created_at: "2016-09-26 09:03:35", updated_at: "2016-09-27 14:35:47">, #<Category id: 5, name: "AWS-Amazon", created_at: "2016-09-26 09:03:43", updated_at: "2016-09-26 09:03:43">]> 

Когда я выбираю:

  • "Рубин" у меня есть: malformed format string - %R
  • "Rails4" У меня есть: malformed format string - %R
  • "Rails5" У меня есть: malformed format string - %R
  • "Heroku" У меня есть: malformed format string - %H
  • "АМС-Амазонка" У меня есть: too few arguments

Я пытаюсь чтобы отфильтровать категории по названию:

категория модели

class Category < ActiveRecord::Base 
    has_many :tutos 

    def self.filter(filter) 
    if filter 
     where(["name LIKE '%#{filter}%'"]).order('created_at DESC') 
    else 
     all 
    end 
    end 
end 

первых Редактировать

Я пытался по-другому, но у меня есть проблемы в каждом:

`where(["name LIKE '%#{filter}%'"]).order('created_at DESC')` 

возвращает некорректную строка предупреждения

`where("name LIKE '%#{filter}%'").order(created_at: :desc)` 

и

`where("name LIKE ?", "%#{filter}%").order('created_at DESC')` 

возвратные все категории без фильтрации ....

вы можете увидеть TUTOS/просмотров/индекс

.container 
    .row 
    h1.text-gray Tutorials 
    .row.search_banner 
    .col-xs-3 
     =form_tag tutos_path, :method => 'get' do 
     =text_field_tag :search, params[:search], placeholder:"Search by keywords" 
     =submit_tag "Search", class:'btn btn-xs btn-default btn-search' 

    .col-xs-3 
     =form_tag tutos_path, :method => 'get' do 
     =select_tag :filter, options_for_select(Category.all.map{|c| c.name}, params[:filter]) 
     =submit_tag "Search", class:"btn btn-xs btn-default btn-search" 

    .col-xs-3 
     -if user_signed_in? 
     = link_to "Create a tuto", new_tuto_path, class:"btn btn-success" 
     br 
     br  


#tutos.transitions-enabled 
    [email protected] do |tuto| 
    .box.panel-default 
     = link_to image_tag(image_by_category(tuto.category.try(:name))), tuto_path(tuto) 


     h3 = link_to tuto.title, tuto_path(tuto), class:"title-link"  
     h6 
     | Created by: 
     span<> 
     = tuto.user.full_name 
     br 
     span.glyphicon.glyphicon-heart 
     span<> 
     = tuto.get_upvotes.size 
     br 
     br 

второй редактировать

Rails журнала консоли: если Я ищу «Heroku» Cartegory: , но поскольку мои категории относятся к tutos ...(Maybe have a look on the website filter are not online yet though but you will see the idea)

Должен ли я сделать что-то вроде этого
Tuto.category.where("name LIKE ?", "%#{filter}%").order('created_at DESC')

Started GET "/tutos?utf8=%E2%9C%93&filter=Heroku&commit=Search" for ::1 at 2016-09-28 17:50:41 +0200 
Processing by TutosController#index as HTML 
    Parameters: {"utf8"=>"✓", "filter"=>"Heroku", "commit"=>"Search"} 
    Category Load (0.3ms) SELECT "categories".* FROM "categories" 
    User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT 1 [["id", 1]] 
    Tuto Load (0.1ms) SELECT "tutos".* FROM "tutos" 
    User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" IN (1) 
    Category Load (0.1ms) SELECT "categories".* FROM "categories" WHERE "categories"."id" IN (2, 3, 5, 4, 1) 
    (0.1ms) SELECT COUNT(*) FROM "votes" WHERE "votes"."votable_id" = ? AND "votes"."votable_type" = ? AND "votes"."vote_flag" = ? AND "votes"."vote_scope" IS NULL [["votable_id", 16], ["votable_type", "Tuto"], ["vote_flag", "t"]] 
    (0.1ms) SELECT COUNT(*) FROM "votes" WHERE "votes"."votable_id" = ? AND "votes"."votable_type" = ? AND "votes"."vote_flag" = ? AND "votes"."vote_scope" IS NULL [["votable_id", 17], ["votable_type", "Tuto"], ["vote_flag", "t"]] 
    (0.0ms) SELECT COUNT(*) FROM "votes" WHERE "votes"."votable_id" = ? AND "votes"."votable_type" = ? AND "votes"."vote_flag" = ? AND "votes"."vote_scope" IS NULL [["votable_id", 18], ["votable_type", "Tuto"], ["vote_flag", "t"]] 
    (0.0ms) SELECT COUNT(*) FROM "votes" WHERE "votes"."votable_id" = ? AND "votes"."votable_type" = ? AND "votes"."vote_flag" = ? AND "votes"."vote_scope" IS NULL [["votable_id", 19], ["votable_type", "Tuto"], ["vote_flag", "t"]] 
    (0.0ms) SELECT COUNT(*) FROM "votes" WHERE "votes"."votable_id" = ? AND "votes"."votable_type" = ? AND "votes"."vote_flag" = ? AND "votes"."vote_scope" IS NULL [["votable_id", 20], ["votable_type", "Tuto"], ["vote_flag", "t"]] 
    (0.0ms) SELECT COUNT(*) FROM "votes" WHERE "votes"."votable_id" = ? AND "votes"."votable_type" = ? AND "votes"."vote_flag" = ? AND "votes"."vote_scope" IS NULL [["votable_id", 21], ["votable_type", "Tuto"], ["vote_flag", "t"]] 
    (0.0ms) SELECT COUNT(*) FROM "votes" WHERE "votes"."votable_id" = ? AND "votes"."votable_type" = ? AND "votes"."vote_flag" = ? AND "votes"."vote_scope" IS NULL [["votable_id", 22], ["votable_type", "Tuto"], ["vote_flag", "t"]] 
    (0.0ms) SELECT COUNT(*) FROM "votes" WHERE "votes"."votable_id" = ? AND "votes"."votable_type" = ? AND "votes"."vote_flag" = ? AND "votes"."vote_scope" IS NULL [["votable_id", 23], ["votable_type", "Tuto"], ["vote_flag", "t"]] 
    (0.0ms) SELECT COUNT(*) FROM "votes" WHERE "votes"."votable_id" = ? AND "votes"."votable_type" = ? AND "votes"."vote_flag" = ? AND "votes"."vote_scope" IS NULL [["votable_id", 24], ["votable_type", "Tuto"], ["vote_flag", "t"]] 
    Rendered tutos/index.html.slim within layouts/application (29.0ms) 
    Rendered layouts/_nav.html.slim (0.4ms) 
Completed 200 OK in 104ms (Views: 94.1ms | ActiveRecord: 1.9ms) 

3 Edit

Tuto модель

class Tuto < ActiveRecord::Base 
    acts_as_votable 
    belongs_to :user 
    belongs_to :category 
    validates :category_id, presence: true 


    def self.search(search) 
    if search 
    where(["title LIKE ?","%#{search}%"]).order('created_at DESC') 
    else 
     all 
    end 
    end 
end 

категории модели Я построю свою категорию filter как Tuto search

class Category < ActiveRecord::Base 
    has_many :tutos 

    def self.filter(filter) 
    if filter 
     #where(["name LIKE '%#{filter}%'"]).order('created_at DESC') 
     #where("name LIKE '%#{filter}%'").order(created_at: :desc) 
    where("name LIKE ?", "%#{filter}%").order('created_at DESC') 
    else 
     all 
    end 
    end 
end 

Проверено с предложенным raise 'check'I have this error:

Не стесняйтесь попросить больше кода, если это необходимо, так как я не знаю, где я не прав. .. Большое спасибо привет

+0

Не могли бы вы вставить в консоль журнал Rails для запроса?, Возможно, фильтр пуст. Еще одна вещь, как вы пытались использовать 'Category.filter' в консоли rails?, Вы также можете проверить там и проверить, работает ли она. Еще одна вещь, которую вы могли бы попробовать, - это сделать TDD, таким образом, сначала напишите свой тест, а затем напишите код, чтобы выполнить свой тест, таким образом вы убедитесь, что все работает. – fanta

+0

Я вставил консольный журнал, я сейчас не делаю TDD ... Я должен узнать, что знаю ... –

+0

на основе журналов консоли rails, ваш запрос 'like' не выполняется, я не знаю, видеть его там. Код вашего контроллера по-прежнему такой же, как тот, который у вас есть здесь. Http://stackoverflow.com/questions/39748221/undefined-method-filter-for-class0x007fc0600be140-edited-need-more-help-p/39748372?noredirect=1 # comment66797749_39748372? – fanta

ответ

0
where("name LIKE ?", "%#{filter}%").order('created_at DESC') 
+0

Я пробовал это раньше, но он не фильтрует ничего –

+0

@sergio, я попробовал это тоже посмотреть на мое редактирование, пожалуйста –

0

Я установил ее!

В моих контрольных тутонах я сделал это: огромное спасибо fanta, который взял меня на правильном пути!

def index 
    #binding.pry 
    if params[:search].present? 
     @tutos = Tuto.search(params[:search]).includes(:user, :category) 
    else 
     @tutos = Tuto.all.includes(:user, :category) 
    end 

    if params[:filter].present? 
     @tutos = Tuto.joins(:category).where('categories.name LIKE ?', params[:filter]) 
    else 
     @categories = Category.all 
    end 
    end 
+0

Приятно знать, что вы нашли, как исправить. И жаль, что я не написал ответ, я писал его, но вы знаете, у меня есть работа и многое другое. – fanta

+0

не беспокойтесь, вы очень помогли! еще раз спасибо ;) –

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