Отправка формы Rails для двух разных моделей

Я работаю над простым веб-приложением, в котором вы импортируете CSV и выполняете поиск по нему с помощью Sunspot. Единственными действиями, которые использует пользователь, являются Index и Show. Все это работает нормально, но конечная цель состоит в том, чтобы иметь возможность точно отслеживать, что ищется, и экспортировать это.

Моя модель datasheets предназначена для загружаемого CSV. Опять же это в том числе поиск работает нормально. И datasheets, и datalog по умолчанию формируются и маршрутизируются. При первой попытке я решил, что просто добавлю определение в свой DatasheetsController, которое создаст новый экземпляр модели datalog с помощью поиска.

datasheets_controller.rb (работает нормально)

def index
  @search = Datasheet.search do
    fulltext params[:search]
  end

  @datasheets = @search.results
  
  respond_to do |format|
    ...
  end
end

Вот моя попытка создать новый журнал данных. Я новичок в Rails и понимаю, что это не RESTful, но я согласен с быстрым и грязным решением здесь.

class DatasheetsController < ApplicationController

  after_filter :log_it

  def log_it
    @datalog = Datalog.new(params[:datalog])
  end

end

Это не сделало ничего полезного в development.log, поэтому я попытался изменить параметры на @datalog = Datalog.new(params[:search]), но это дало мне следующую ошибку:

NoMethodError in DatasheetsController#index

undefined method `stringify_keys` for "[whatever is searched for]":string

Я уверен, что я далеко здесь, но я подумал, что это будет легко добавить, но это не так. Если это поможет, как только это сработает, я бы хотел, чтобы созданный атрибут datalog :name совпадал со строкой, которую искали. Любая точка в правильном направлении (или шлепок за то, что он сделал это так плохо) будет очень признательна.

РЕДАКТИРОВАТЬ: я также хотел бы добавить, что если есть простой способ регистрации результатов поиска (он не обязательно должен быть в модели), приветствуется все (включая драгоценные камни). Я искал столько вариантов ключевых слов, сколько мог придумать в Google и SO, и ничего не смог найти.

РЕДАКТИРОВАТЬ 2:

После редактирования нескольких вещей я стал ближе, но у меня все еще есть проблемы.

Я добавил следующее к def index:

@logkey = :search

и изменил определение log_it на:

def log_it
  @datalog = Datalog.new(params[:id])
  @datalog.update_attribute(:name, @logkey)
end

Теперь новый журнал данных будет экономить на поиске, и это здорово, но атрибут :name всегда заканчивается поиском.

Пример таблицы, которая у меня сейчас есть для журналов данных:


Имя

поиск Показать Редактировать Уничтожить

поиск Показать Редактировать Уничтожить

поиск Показать Редактировать Уничтожить

поиск Показать Редактировать Уничтожить

поиск Показать Редактировать Уничтожить

Новый журнал данных


Я пытался изменить строку @logkey на: @logkey = :search.to_s, но на самом деле это ни на что не влияет.

ИЗМЕНИТЬ в ответ на ответ

SQL (0,5 мс) ВСТАВИТЬ В журналы данных (создано_в, имя, обновлено_в) ЗНАЧЕНИЯ (?, ?, ?, ?) [[создано_в, вторник, 26 февраля 2013 г. 18:26:04 UTC +00:00], [имя, ноль ], [updated_at, Вт, 26 февраля 2013 г. 18:26:04 UTC +00:00]]

Опять же, если это просто проблема в другом месте, я понимаю это и могу найти ее в свободное время. Еще раз спасибо!


person Jason    schedule 26.02.2013    source источник
comment
@logkey = params[:search].to_s однако см. мой ответ ниже.   -  person p1100i    schedule 26.02.2013


Ответы (1)


Проблема заключается в следующем:

  • Я предполагаю, что ваша модель журнала данных получена из ActiveRecord::Base (стандартный способ создания моделей в рельсах).
  • .new method of this class (documented here) takes an attribute hash (and options, but we don't care about that right now )
    • from this hash .new tries to create an instance of the class using every key-value pair of the hash in a way that the instances key-named attribute should be set as the value
  • проблема в том, что params[:search] в вашем примере нельзя использовать в качестве аргумента для .new, поэтому выдает исключение

Как это должно выглядеть:

  • в модели журнала данных у вас должно быть что-то вроде: :attr_accessor name
  • параметры должны params[:search] = { :name => 'My favourite search name' }

Другие примечания
Если вы используете просто bundle exec rails s, вы можете увидеть свои параметры в журнале сервера. В производстве просто используйте: less log/development.log. Вы можете проверить, через что вы отправляете свое приложение.

Обновление после обновления вопроса

@logkey = params[:search].to_s

Обновление после комментария

Хорошо, эта строка @datalog.update_attribute(:name, @logkey) не нужна. Просто идите со своим оригинальным: @datalog = Datalog.new(params[:datalog]) это "рельсовый путь".

Имейте в виду мою первую часть ответа, поэтому params[:datalog] должен быть хешем. Однако, если вы не можете этого сделать, просто используйте:

@datalog = Datalog.new(params[:id])
@datalog.name = params[:search] # I dont think to_s is needed
@datalog.save # To save it into the database
person p1100i    schedule 26.02.2013
comment
+1 Большое спасибо за отличное объяснение, теперь оно имеет гораздо больше смысла. К сожалению, после реализации :name становится равным нулю. Я не получаю никаких ошибок в console или development.log. Я точно в курсе, что это не ваш совет, а скорее всего проблема, которая уже была. Я отредактирую строку SQL INSERT INTO в своем вопросе, если это поможет. - person Jason; 26.02.2013
comment
Вау, последнее редактирование заставило меня щелкнуть. Я делал этот путь более трудным, чем нужно. Большое спасибо за вашу помощь! - person Jason; 26.02.2013