После 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'
Не стесняйтесь попросить больше кода, если это необходимо, так как я не знаю, где я не прав. .. Большое спасибо привет
Не могли бы вы вставить в консоль журнал Rails для запроса?, Возможно, фильтр пуст. Еще одна вещь, как вы пытались использовать 'Category.filter' в консоли rails?, Вы также можете проверить там и проверить, работает ли она. Еще одна вещь, которую вы могли бы попробовать, - это сделать TDD, таким образом, сначала напишите свой тест, а затем напишите код, чтобы выполнить свой тест, таким образом вы убедитесь, что все работает. – fanta
Я вставил консольный журнал, я сейчас не делаю TDD ... Я должен узнать, что знаю ... –
на основе журналов консоли rails, ваш запрос 'like' не выполняется, я не знаю, видеть его там. Код вашего контроллера по-прежнему такой же, как тот, который у вас есть здесь. Http://stackoverflow.com/questions/39748221/undefined-method-filter-for-class0x007fc0600be140-edited-need-more-help-p/39748372?noredirect=1 # comment66797749_39748372? – fanta