2011-05-17 58 views
2

我已經創建了一個使用ruby的消息發佈功能,現在我的問題是編輯帖子的功能可用,但無論發佈原始帖子的人是誰,都可以訪問它。我怎樣才能做到這一點,因此編輯'鏈接'只能被原始海報查看或訪問或使用。如果需要任何代碼請問,謝謝。如何限制對在rails上創建帖子的特定用戶進行編輯?

這是我現在得到的錯誤:

undefined local variable or method `current_user' for #<ActionView::Base:0x4cdbb48> 
Extracted source (around line #7): 

4:  <dd> 
5:  <%= car.name %><br /> 
6:  <%= car.description %><br /> 
7:  <%= link_to('edit', edit_post_path(@car)) if current_user.cars.include?(@car) %> 
8:  <%= link_to "Delete", 
9:  :controller => :car, 
10: :action => :delete, 

回答

2

如果在用戶對象中獲取的方式,你應該有這樣對自己的帖子關係:

class User < ActiveRecord::Base 
    has_many :posts 
end 

class Post < ActiveRecord::Base 
    belongs_to :user 
end 

這可以讓你獲得和建立崗位範圍的用戶,像這樣:

User.find(1).posts #=> [<Post id:1>, <Post id:2>, <Post id:4>] 

可枚舉#檢測可以遍歷一個陣列和一個塊返回evalutates爲true第一項,像這樣:

@post = User.find(1).posts.detect do |post| 
    post.id == 4 
end 
@post #=> <Post id:4> 

大多數Rails應用程序都有某種幫助程序來訪問當前登錄的用戶。如果沒有,我建議你把一個在application_controller這樣的:

def current_user 
    @current_user ||= User.find(whatever_you_do_to_get_the_logged_in_user) 
end 

範圍查找在編輯和更新操作的職位用戶擁有這樣的:

def edit 
    @post = current_user.posts.detect{|p| p.id == params[:id] } 
end 

,並在您的視圖:

<%= link_to('edit', edit_post_path(@post)) if current_user.posts.include?(@post) %> 
+0

我現在就來看看會發生什麼@unixmonkey – 2011-05-18 12:09:44

+0

什麼是p和p.id?也是我的帖子被稱爲「汽車」我不必定義每個'汽車'的用戶名是張貼嗎? @unixmonkey – 2011-05-18 12:21:40

+0

我已經添加了代碼行等我應該更改p.id car.id,因爲我有那作爲每個單獨職位的ID,以及我將如何定義變量current_user在我的car_controller.rb? 請查看我現在在OP – 2011-05-18 12:29:59

2

您必須鏈接到創建用戶模型中的職位,並檢查在編輯動作的所有權和/或權限。

使用cancan gem來處理權限或查看this railscast使用它來做一個非常類似的保護來滿足您的需求可能會很好。

railscast使用cancan與authlogic,但它也可以與其他身份驗證一起使用。

+0

我不能在創建這個在線應用程序時使用外部導軌添加件等,它必須在沒有添加的標準導軌上運行 – 2011-05-18 12:08:49

+0

然後查看代碼,瞭解它並將其用作如何執行操作的模型你自己。 – 2011-05-18 12:53:06

相關問題