Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Rails 4.2.4中,将Desive配置为用户只读,管理员使用完整CRUD_Ruby On Rails_Ruby_Devise - Fatal编程技术网

Ruby on rails 在Rails 4.2.4中,将Desive配置为用户只读,管理员使用完整CRUD

Ruby on rails 在Rails 4.2.4中,将Desive配置为用户只读,管理员使用完整CRUD,ruby-on-rails,ruby,devise,Ruby On Rails,Ruby,Devise,我是一名初级开发人员,使用rails 4.2.4、Desive和Pin脚手架构建电子商务web应用程序 现在,用户可以注册、登录,然后在index.html.erb上创建、读取更新和销毁pin 问题:我不希望登录的用户能够CRUD(仅读取) 我想设置这个,所以我作为管理员只能创建、更新或销毁。用户和来宾只能阅读 我已经为此奋斗了几个星期,如果能得到帮助,我将不胜感激 这是我的品脱控制器 class PinsControllerparams[:page],:per#page=>15) 其他的 @p

我是一名初级开发人员,使用rails 4.2.4、Desive和Pin脚手架构建电子商务web应用程序

现在,用户可以注册、登录,然后在index.html.erb上创建、读取更新和销毁pin

问题:我不希望登录的用户能够CRUD(仅读取)

我想设置这个,所以我作为管理员只能创建、更新或销毁。用户和来宾只能阅读

我已经为此奋斗了几个星期,如果能得到帮助,我将不胜感激

这是我的品脱控制器

class PinsControllerparams[:page],:per#page=>15)
其他的
@pins=Pin.all.order(“在描述时创建”).paginate(:page=>params[:page],:per\u page=>15)
结束
结束
def秀
结束
def新
@pin=当前_user.pins.build
授权(@pin)
结束
定义编辑
结束
def创建
@pin=当前用户.pins.build(pin参数)
如果@pin.save
将_重定向到@pin,注意:“pin已成功创建。”
其他的
渲染:新
结束
结束
def更新
如果@pin.update(pin_参数)
将_重定向到@pin,注意:“pin已成功更新。”
其他的
渲染:编辑
结束
结束
def销毁
@销
重定向到pins\u url
结束
私有的
#使用回调在操作之间共享公共设置或约束。
def设置针
@pin=pin.find_by(id:params[:id])
结束
def正确的用户
@pin=当前用户.pins.find_by(id:params[:id])
重定向到pin路径,注意:如果@pin.nil,则“无权编辑此pin”?
结束
#永远不要相信来自恐怖网络的参数,只允许白名单通过。
def引脚参数
参数require(:pin).permit(:description,:image)
结束
结束
这是我的Index.html.erb

出售

您希望每个人(登录用户或只是任务)都能够访问
索引和
show
方法。所有其他方法仅限管理员使用

第一步:我们需要一种识别管理员的方法。将布尔值
admin
属性添加到
User
模型中。在命令行上运行以下命令以创建新迁移:

$ rails g migration add_admin_to_users admin:boolean
打开生成的文件并向其添加
default:false
,它应该如下所示:

class AddAdminToUsers < ActiveRecord::Migration
  def change
    add_column :users, :admin, :boolean, default: false
  end
end
如您所见,Rails会自动向用户添加一个
admin?
方法。我们现在在控制器中使用该方法:

before_action :find_pin,           only: [:show, :edit, :update, :destroy]
before_action :authenticate_user!, except: [:index, :show]
before_action :ensure_admin,       except: [:index, :show]
使用此
private
方法:

def find_pin
  @pin = Pin.find(params[:id]) # renders 404 in production when pin isn't found
end

def ensure_admin
  unless current_user.admin?
    redirect_to(pins_path, notice: 'Not authorized to edit this pin')
  end
end
使用视图中相同的
admin?
方法隐藏来自非管理员的
edit
destroy
链接:

<%= link_to 'Show', pin_path(pin) %>
<% if current_user && current_user.admin? %>
  <%= link_to 'Edit', edit_pin_path(pin) %>
  <%= link_to 'Destroy', pin, method: :delete, data: { confirm: 'Are you sure?' } %>
<% end %>


我认为您应该使用一些授权宝石,如cancan rolify或Pundit。我已经安装了Pundit,但这是一场噩梦。我可以让它工作,但它不区分用户和我作为管理员,并阻止页面如何识别
管理员
?或者你指的是类似pin的所有者(pin.user
)的东西?@spickermann这是谜题的另一部分。我已经完成了一个迁移,将_admin _添加到_用户,并尝试在rails控制台中设置这样的内容。我甚至不知道这是否是正确的方法。我很痛苦不得不问一个有你资历的人这样一个愚蠢的问题。系统如何知道我是管理员我基本上不能让登录的人有权创建、删除和更新,因为这是出售的所有者产品,管理员应该能够CRUD。简言之,我可以查看CRUD,其他人查看
确保所有者
方法确保只有pin的所有者可以管理pin。如果您还希望管理员能够管理所有PIN,那么您的用户模型需要某种标志(链接a
boolean:admin
)。这将允许将检查更改为:
,除非当前_user.admin?|当前用户==@pin.user
。你的规则越复杂,使用像
pundit
cancancan
这样的gem就越有意义我之所以选择tweek Desive,是因为我安装了pundit,它在一定程度上起作用,但它并没有区分我(管理员)和用户,阻止所有人,因此,在部署代码之前,我试图理解您的代码。我的新代码应该有3个单独的操作前。上面你已经写了3个单独的动作
before_action :find_pin,           only: [:show, :edit, :update, :destroy]
before_action :authenticate_user!, except: [:index, :show]
before_action :ensure_admin,       except: [:index, :show]
def find_pin
  @pin = Pin.find(params[:id]) # renders 404 in production when pin isn't found
end

def ensure_admin
  unless current_user.admin?
    redirect_to(pins_path, notice: 'Not authorized to edit this pin')
  end
end
<%= link_to 'Show', pin_path(pin) %>
<% if current_user && current_user.admin? %>
  <%= link_to 'Edit', edit_pin_path(pin) %>
  <%= link_to 'Destroy', pin, method: :delete, data: { confirm: 'Are you sure?' } %>
<% end %>