私のRubyのWebアプリケーションの1ページをSTIモデルタイプの1つにアクセスできないようにしたい。私は、Userから継承するtypeAとtypeBという2つのモデルを持っています。私はSTIを実装するためにUserテーブルのカラムタイプを使用しました。私はUserセッションにDevise gemを使用しています。私は1つのウェブページ 'http://localhost:3000/rate'を自分のtypeA Userにアクセスできないようにします。ユーザーが 'typeA'タイプのユーザーでログインすると、リンクに 'Rate'のオプションが表示されません。しかし、私は彼がリンク 'http://localhost:3000/rate'によってそのページにアクセスできるようにしたくありません。彼がそのリンクを介してアクセスしようとすると、私は彼にサインして再びログインさせたいと思う。 私はこれを、私のコントローラーのコードに「rate」という特定の方法を使って管理しました。Ruby on Railsアプリケーションの特定のページを、STIベースのDevise Userモデルタイプにアクセスできないようにするにはどうすればよいですか?
def rate
if current_user.type == "typeA"
sign_out(current_user)
redirect_to new_user_session_path
else
#Code for User of typeB
end
end
これが働いているが、私は、これはbefore_filter使用してより良い方法で行うことができるかどうかを知りたいと思った:authenticate_userを!または何か他の は、今のところ私のbefore_filterの部分は、私はその機能を実現するために、上のコードに変更を加えることができますどのような方法があります。この
before_filter :authenticate_user!, except: [:index, :show]
のように見えます。
P.S:私がCanCan/Punditのような役割や他の宝石を使っていたら、これはもっとうまくいくかもしれませんが、プロジェクトを提出するまでに時間がかかりません。私はbefore_action(before_filterの新名称)はレンダリングまたはリダイレクトする場合は、アクションが処理されることはありません信じて
class SomeController < ApplicationController
before_action :authorize_user!, except: [:index, :show]
def top_secret
...
end
end
:あなたのコントローラと
class ApplicationController
before_action :authenticate_user!
def authorize_user!
if current_user.type == "typeA"
sign_out(current_user)
redirect_to new_user_session_path
end
end
end
:
私は、コントローラ全体がタイプAにアクセスできないようにしたくありません。私は彼に「レート」ページだけにアクセスできないようにしたい。索引、作成、ショーなどの他の方法がありますが、まだ彼にアクセス可能でなければなりません。それを私のコードにどのように入れますか? –
あなたは 'only:'オプションを使って 'before_filter {| c | c.confirm_user_type(タイプA)}、:のみ=> [:率] ' – sa77
が、私は今、取得エラーページが/Users/Suvajit/Documents/Code/Rails/Mckenzie/app/controllers/dishes_controller.rb:4です:構文エラー、予期しない ':'、keyword_end .confirm_user_type(タイプA)を期待}のみ=>:| | C [レート]^ 私が使用しているコードは 'before_filter {ありますc:=> [:rate] ' –