0

私は、CSVをインポートし、Sunspotを使用してそれを検索する単純なWebアプリに取り組んでいます。ユーザーが使用しているアクションは、インデックスと表示のみです。これらはすべて正常に機能していますが、最終的な目標は、検索対象を正確に追跡してエクスポートできるようにすることです。

私の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で何の役にも立たなかったので、paramsをに変更しようとし@datalog = Datalog.new(params[:search])ましたが、次のエラーが発生しました。

NoMethodError in DatasheetsController#index

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

私はここから離れていると確信していますが、これは簡単に投入できると思いましたが、そうではありませんでした。それが役に立ったら、これが機能したら、作成されたdatalog属性:nameを検索された文字列と同じにするようにします。正しい方向へのポイント(またはそれをうまくやらないためのスマック)は非常にありがたいです。

編集:検索結果をログに記録する簡単な方法がある場合(モデルに含まれている必要はありません)、何でも歓迎します(宝石を含む)。私はグーグルと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.5ms)INSERT INTO "datalogs"( "created_at"、 "name"、 "updated_at")VALUES(?、?、?、?)[["created_at"、Tue、26 Feb 2013 18:26:04 UTC +00:00]、["name"、nil]、["updated_at"、Tue、26 Feb 2013 18:26:04 UTC +00:00]]

繰り返しますが、これが他の場所での問題である場合、私はそれを取得し、自分の時間でそれを探すことができます。再度、感謝します!

4

1 に答える 1

1

問題は次のとおりです。

  • 私はあなたのデータログモデルがActiveRecord::Base(レールでモデルを行う標準的な方法) から派生していると仮定しています
  • .newこのクラスのメソッド(ここに記載されています)は、属性ハッシュ(およびオプションですが、現時点では気にしません)を取ります
    • from this hash.newは、インスタンスのkey-named属性を値として設定する方法で、ハッシュのすべてのキーと値のペアを使用してクラスのインスタンスを作成しようとします。
  • 問題は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
于 2013-02-26T18:04:58.433 に答える