2016-12-07 2 views
0

私は自分のプロジェクトの1つを削除するためにcurrent_usersパスワードを受け入れるform_forを作成しようとしています。基本的に、削除のプロセスはそのユーザーについて何も知る必要はありません。プロジェクトの削除を確実にするための確認ステップだけです。私のフォームはどのように見えますか?これはform_forである必要はありませんが、form_tagでもかまいません。ユーザパスワードを持つオブジェクトを削除する - Rails

現在の表示:

<div class="modal"> 

    <h2>Confirm Project Deletion</h2> 

    <%= form_for @user, url: new_account_path, method: :delete, do |f| %> 

    <%= f.submit %> 

    <% end %> 

    </div> 

私はまた、あなたが見ることができるようにそれに接続されているcurrent_projectだけでなく、CURRENT_USERを持って@projectへのアクセス権を持っています。どんな助けでも大変感謝しています。

+0

CanCanCanなど、current_userに基づくリソースベースの認可を有効にする認可宝石を使用することを検討しましたか?つまり、current_userが自分の所有するプロジェクトを削除できるようにする能力を設定できますか?それとも、これはあなたの必要に迫ったものですか? – David

答えて

1

Aかなり一般的なアプローチは、このように、すべてのプロジェクトのインデックスページで削除タグを使用することです:

<% @projects.each do |project| %> 
    <%= project.title %> 
    ... 
    <% if current_user.id == project.user_id %> 
    <%= link_to project, method: :delete, data: { confirm: 'This will delete this project.' } do %> 
    Delete! 
    <% end %> 
<% end %> 

のみプロジェクトのユーザーはちょうどその、インデックスページにのみ、彼のプロジェクトを見ることができる場合ユーザがすでに認証されているため、link_toメソッド::deleteを使用してください。

その後、あなたは、単にすべてのあなたがそのような

<%= form_tag project_path(id: project.id), method: :delete do %> 
    <%= label_tag :password %> 
    <%= password_field_tag 'password', '' %> 
    <input value='Delete Project' type='submit' id='submit-form'/> 
<% end %> 

としてフォームを設定することができ

project DELETE /projects/:id(.:format) projects#destroy

:あなたのページ内のローカル変数projectを持っており、のようなルートを持っていると仮定すると

+0

これはあまり安全ではありませんが、悪意のあるユーザーがランダムなプロジェクトIDを使用してページを修正し、他のユーザープロジェクトを削除することによって混乱を招くことはありません。ユーザーが認証の詳細を確認しているのか、認証の上にリソースベースの認証をしているのかに関係なく、認証サーバー側が必要です。 – David

+0

current_userは、ユーザーがログインした後でのみ使用可能になります。ページにcurrent_userが必要ない場合は、削除ボタンはありません。どのように危険ですか? –

+0

ユーザーログイン...ビュー - 自分が所有しているため、削除ボタンが付いている各プロジェクト....すべてのブラウザの要素を検査する... htmlを変更して削除リンクのプロジェクトIDを変更する...クリックを送信する。 .. voila ...彼がアクセスできないプロジェクトを削除することができます。 – David

0

あなたの認証チェックをdestroyメソッドに追加する必要があります:

def destroy 
    project = Project.find(params[:id]) 
    password = params[:password] 
    # Do my authentication check here 

    if @project and authenticated 
    @project.destroy 
    respond_to do |format| 
     format.html { redirect_to projects_url, notice: 'Project was successfully destroyed.' } 
    end 
    end 
end 

個人的には、CanCanCanなどのリソースベースの認証メカニズムを実装すると、認証システムと連携して動作する方がずっと良いと思います。これにより、current_userが自分のプロジェクトを表示/削除/管理できるようにする能力(ルール)を設定できます。リソースを破壊するたびに認証する必要はありません。