Вы также можете использовать гем типа Declarative_authorization , чтобы сделать это.Если вы хотите сделать это самостоятельно, я бы порекомендовал просто немного высушить ваш код:
class Owner::PropertiesController < Owner::BaseController
before_filter :check_owner, :only => [:update, :destroy]
def update
if @property.update_attributes(params[:property])
redirect_to([:owner, @property], :notice => 'Property was successfully updated.')
else
render :action => "edit"
end
end
def destroy
@property.destroy
redirect_to(owner_properties_url)
end
private
def check_owner
@property = Property.find(params[:id]
if @property.owner_id != session[:owner_id]
redirect_to([:owner, @property], :notice => "Property not found.") and return
end
end
end
Кроме того, вы можете отфильтровать ваши свойства по владельцу, чтобы гарантировать, что пользователь, не являющийся владельцем, не сможетвзаимодействовать со свойствами, которые не являются его / ее.Например:
def update
@owner = Owner.find(session[:owner_id])
@property = @owner.properties.find(params[:id])
redirect_to unauthorized_page and return if @property.nil?
end
Это заставляет искомые свойства принадлежать сеансу [: owner_id] вместо всего множества свойств.Это означает, что свойства, которыми сеанс [: owner_id] не принадлежит, даже не будут рассматриваться.Затем вы можете поместить этот код в before_filter, чтобы его можно было многократно использовать в нескольких действиях.