簡體   English   中英

Rails 4:當前用戶只能編輯他們的帖子

[英]Rails 4 : Current user can only edit their post

用戶只能在登錄時進行編輯,但問題是任何登錄的用戶都可以編輯其他用戶的內容。 如何進行用戶特定的編輯,只有當前用戶只能編輯他們的內容?

class JobsController < ApplicationController
    before_action :find_job, only: [:show, :edit, :update, :destroy]
    before_action :authenticate_user!,except:[:index]

    def show
    end

    def update
        if @job.update(jobs_params)
            redirect_to @job
        else
            render "Edit"
        end
    end 

    private

    def jobs_params
        params.require(:job).permit(:title, :description, :company, :url, :jobcategory_id)
    end

    def find_job
        @job = Job.find(params[:id])
    end
end


show.html.haml                                            
- if user_signed_in?
    = link_to "Back", root_path, class: "btn btn-sm btn-default"
    = link_to "Edit", edit_job_path(@job), class: "btn btn-sm btn-default"

您尚未將JobUser關聯。 沒有它如何識別哪個User發布了哪個Job

對於該員工與User Job

user.rb中

has_many :jobs

job.rb

belongs_to :user

然后將user_id列添加到Job表,並在strong參數中添加user_id

要在Job表中添加user_id列:

rails g migration AddUseridToJob user_id:integer
rake db:migrate

在您的模板中: jobs / _form.html.haml指定user_id

=  f.hidden_field :user_id , :value => current_user.id

當用戶在數據中創建job ,它將與該特定User相關聯,因此您可以識別和限制某些操作。

按照上述步驟試試這個:

- if (user_signed_in? && (current_user.id == @job.user_id))
    = link_to "Edit", edit_job_path(@job), class: "btn btn-sm btn-default"

注意:

  • 首先在sign_in之后創建新作業,然后檢查edit操作鏈接是否會被任何其他用戶看不到。
  • 如果您嘗試檢查現有作業(舊作業),則可能會出現錯誤,因為現有作業的數據可能不包含user_id
  • 這只會隱藏編輯鏈接。
  • 您可以使用cancancan gem進行授權

如果您不想讓任何其他用戶edit / update / delete作業並將其重定向到索引頁面,則實現job_owner方法,如下所示:

class JobsController < ApplicationController
    before_action :find_job, only: [:show, :edit, :update, :destroy, :job_owner]
    before_action :authenticate_user!,except:[:index]
    before_action :job_owner, only: [:edit, :update, :destroy]
    ....
    # add this method                         
    def job_owner
     unless @job.user_id == current_user.id
      flash[:notice] = 'Access denied as you are not owner of this Job'
      redirect_to jobs_path
     end
    end
    ....                                        
end

我建議使用cancancan gem並定義你的能力如下:

 can [ :edit, :update, :delete ], Job do |job|
   job.user_id == user.id
 end

您可以創建一個輔助方法:

def user_allowed
  user_signed_in? && (current_user.id == @job.user_id)
end

然后在你的行動之前調用它:

<% if user_allowed %>

你可能想要這樣的東西?

= link_to "Edit", edit_job_path(@job), class: "btn btn-sm btn-default" if @current_user.id == @job.owner_id

請注意,owner_id是我編寫的。 您沒有提供有關用戶可以/不能編輯的內容的足夠上下文。 如何確定作業是屬於用戶還是可由他們編輯。 這應該會給你一些事情。

您可能想要調查某些授權寶石,如專家 Pundit將允許您為每個控制器設置策略,並允許您以精細的粒度管理訪問。 該文檔描述了如何設置它並使用before_action來在運行操作之前驗證授權。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM