我会尽可能彻底地解释这一点。我试图找出通过表单传递不应被篡改的现有数据作为隐藏值的最佳方法 - 或者是否有更好的方法将数据发送到新的“创建”方法。
基本上我想要实现的是,首先创建一个事务并存储group_id,owner_id,user_id,message和status。然后,当用户“接受”请求时,将创建一个基本上所有相同信息(group_id,owner_id和user_id)的新事务,但状态和消息可以更改。
所以流程如何: 用户首先创建一个请求:
Request.create("gid" => 1, "user_id" => 2, "owner_id" => 4, "message" => "Bla Bla", "status" => 'pending')
然后该请求的所有者查看该请求,并且能够接受或拒绝该事务。请记住,所有请求都在同一页面中,因此在同一页面上会有许多接受和拒绝,但每个都通过@request = Requests.where(:owner_id => 4)进行迭代。
隐藏输入的问题是您可以轻松地篡改它以更改您不应该的列。我想弄清楚的是,如果有一种方法将值传递给accept方法,使用new(message)和old(group_id,user_id,owner_id)创建一个新行?
新交易基本上是这样的:
Request.accept("gid" => ori_trans, "user_id" => ori_trans, "owner_id" => ori_trans, "message" => "New Message", "appointment" => ori_trans, "status" => 'accepted')
def accept
@request = Request.new(request_params)
@request.status = 'accepted'
@request.expert_id = current_user.id
respond_to do |format|
if @request.save
format.html { redirect_to @request, notice: 'Request was successfully created.' }
format.json { render action: 'show', status: :created, location: @request }
else
format.html { render action: 'new' }
format.json { render json: @request.errors, status: :unprocessable_entity }
end
end
end
def request_params
params.require(:request).permit(:gid, :user_id, :message)
end
白名单GID和user_id的问题是用户可以使用表单进行调整以允许更改此字段。理想情况下,我只想允许:来自params的消息。
希望这能解释我正在尝试做什么 - 如果您有任何建议,请告诉我。
答案 0 :(得分:1)
我认为以下代码应该符合您的要求:
def accept
original_request = Request.find(params[:request][:id])
if original_request.owner_id != current_user.id
#do something here, logout maybe?
return
end
@request = original_request.dup
@request.message = params[:request][:message]
@request.status = 'accepted'
respond_to do |format|
if @request.save
format.html { redirect_to @request, notice: 'Request was successfully created.' }
format.json { render action: 'show', status: :created, location: @request }
else
format.html { render action: 'new' }
format.json { render json: @request.errors, status: :unprocessable_entity }
end
end
end
使用此代码,即使有人篡改了请求ID参数,如果他们尝试接受他们不拥有的请求,那么它也会失败。