2017-11-20 26 views
0

私はRails 4.2.6アプリケーションを開発中です。私はコントローラからモデルにテーブルのパラメータを転送する必要があります。Rails:未定義のローカル変数またはメソッド `params '

if !element.nil? 
      html += "<td class=\"soa-element text-center\" form_id=\"#{form.id}\" visit_id=\"#{visit.id}\" id=\"#{element.id}\">" 
      html += params[:table_data].gsub('<span class="glyphicon glyphicon-ok text-success"></span>', '&#10004;') if params[:table_data].present? 
      html += "</td>" 
     else 
      html += "<td class=\"soa-element\" form_id=\"#{form.id}\" visit_id=\"#{visit.id}\" id=\"0\"></td>" 
     end  

ここで私はエラーを取得していますが、私は把握することはできません上:私はコードのこの行ではモデルにコードhtml += params[:table_data].gsub('<span class="glyphicon glyphicon-ok text-success"></span>', '&#10004;') if params[:table_data].present?の次の行を転送しようとしているこのエラーundefined local variable or method 'params'を取得していますこれを行います私は間違っていました。

次ペーストビンは、この問題に関連したモデルとコントローラである:私は私のアプリはまだ働いて元だったが、私は、コントローラ内部のテーブル要素を持つことができないように保つ場合

https://pastebin.com/cVy9QRCy

https://pastebin.com/ApZSgYFE

それをモデルに転送する必要があります。私は何が間違っているのか理解する必要があります。

+0

提供された回答が役に立ったかどうか不思議... – jvillian

+0

@jvillian回答が私に一般的なアイデアを与えましたので参考にしましたが、まだこの問題を解決する必要があります。 – Jakub

答えて

0

コントローラからビューにパラメータを転送しません。代わりにインスタンス変数を使用してください。あなたのコントローラに変数paramsを宣言すると、それはあなたのビューで利用可能になります。

まず、MVCの概念をクリアする必要があります。

+0

私はそれを簡単な例にしてください。 私のオフィスのプロジェクトでは、そのコード行をコントローラーからモデルに転送することが求められました。出来ますか? – Jakub

0

上記の答えはあなたが本当にそうしたくないかもしれないことを正しく示していますが、本当にしたい場合は、@params = the_paramsとするか、同じ方法で@その変数が表示されます。

0

これが役立つかどうかはわかりません。コントローラから変数への変数の転送@varaible ...

モデルに転送する場合は、Model.rbファイルの関数内で実行する必要があります。お使いのモデルで

+0

はい、私が実際にしなければならないことは、モデルの下にその行を置き、コントローラーで呼び出すことです。例として、PDFへのエクスポート用の同じコントローラ 'html + = PdfReport.page_break'上にこれを持っています。私は、コードの行で 'Class.soa_table_export'のような何かをしたいと思いますが、まだ私はこのparamsについてのエラーが定義されていません。彼らが定義されていないので、 – Jakub

+0

を定義するには、コントローラーで '@params = something'を実行する必要があります – Azaryan

0

は、すでにここで、のparamsを受け取る方法の例があります:

def update_state(params) 
    self.update(params) 
    self.reload 
    self.next_state_version 
    self.save 
end 

そして、あなたはここで、コントローラから、このようなメソッドを呼び出す方法の例:

def update_status 
    find_token 
    if @token.nil? 
    flash[:error] = "The changes were not saved as the edit lock has timed out." 
    else 
    @study_version.update_state(the_params) 
    AuditTrail.update_item_event(current_user, @study.identifier, @study_version.semantic_version, "Study version updated") 
    @token.release 
    end 
    redirect_to history_study_path(@study) 
end  

だから、あなたのモデルでは、実行します。

def soa(params) 
    ... 
end 

そして、あなたのコントローラで:

def soa 
    @study_version = StudyVersion.find(params[:id]) 
    render text: @study_version.soa(the_params).html_safe 
end 

私はまた、この論理とコードの多くは、IMOをサービスオブジェクトとプレゼンターに移すべきだと付け加えました。あまりにも多くの(再び、IMO)あなたのコントローラで行っているし、あなたのモデルにそれをプッシュすることははるかに良いではありません。あなたはちょうど別の引き出しにあなたの迷惑を詰めている。

関連する問題