2016-05-06 13 views
0

私はコントローラからいくつかのロジックを切り離そうとしていますが、私が望むように動作させることはできません。その後、私は私のモデルにレール4:バリデーションを使用してモデルとコントローラを分離する

# WeighIn model  

def self.import(file) 
    CSV.foreach(file.path, headers: true) do |row| 
     hashed_row = row.to_hash 
     # VALIDATE HERE 
     WeighIn.create hashed_row 
    end 
end 

が、エントリを作成する前にCSV解析機能を持っている

# Controller (WeighIn belongs_to User) 

def bulk_upload_weigh_ins 
    import = WeighIn.import(params[:file]) 
    redirect_to import_weigh_ins_path, notice: "Weigh Ins Imported Successfully!" 
end 

:私は、CSVファイルを取り、私のWeighInsテーブルに各行を入力し、私のコントローラ内の機能を持っていますWeighInsテーブルでは、ハッシュの属性に対応するUserがあることを確認します。User.find_by(scale_id: hashed_row["scale_id"]) != nilここで、scale_idは行の一部で、列はUserテーブルにあります。

は、どのように私はこれを検証し、「scale_idためいいえユーザー:フー」がない私に指示便利なエラーを返すことができ

答えて

1

あなたはモデルやコントローラのいずれかでそれを行うことができます。ほとんどの開発者は再利用可能性に関して設計上の決定を下します。ユーザー承認はモデルの汎用目的ですか?モデルを再利用する場合は、同じ認証方式を使用しますか?

モデルに入れると、WeighInモデルはUserモデルまたは認可モデルにアクセスできる必要があります。インポート関数は、成功を通知するためにtrueを返します。コントローラで

、あなたは

before_action :check_authorization, only: [:bulk_upload_weigh_ins] 

private 
    def check_autorization 
    render nothing:true, status: :forbidden unless (autorized_condition) 
    end 
のように、実際の関数が呼び出される前に、承認を確認することができます「before_action」コールバックで、すでに自分を指摘し、またはより一般的な条件を用いて認証を実装することができます

どちらの場合でも、エラーメッセージ付きのレイアウトをレンダリングすることで、 "render nothing:true、status::forbidden"またはより洗練されたhtml応答を使用してHTTP禁止応答(403)を返すことができます。ここでは、あなたの「WeighIn/bulk_upload_weigh_ins.html.erb」(またはHAML)で使用することができ、「フラッシュ」通常で来て、テンプレート(The Flashを参照)。

flash[:alert] = "You are wrong!" 

、あなたのアクションのいずれかで、何もしません(あなたが処理を停止するbefore_actionを使用する場合は、これらのいずれかが行われなければならない)特別なテンプレートをレンダリングするか、ユーザーをリダイレクトする、(アクションのデフォルトテンプレートをレンダリングします)。

render 'an_error_template' # in views/controller/an_error_template.html.erb or haml 

redirect_to :other_action # sends the browser to another action, flash[:alert] is still accessible there 

ます。レイアウトでフラッシュを照会することを忘れないでくださいまたはメッセージを表示するアクションテンプレート

<% flash.each do |message_type, message| %> 
    <%= content_tag(:div, message, class: "alert alert-#{message_type}") %> 
<% end %> 
+0

このような詳細な対応をいただき、ありがとうございます。これらの手順を確実に実行します。 –

関連する問題