Rails4将现有/以前的记录值传递给新记录



我会尽可能彻底地解释这一点。我正试图找出通过表单传递不应被篡改为隐藏值的现有数据的最佳方式,或者是否有更好的方式将数据发送到新的"创建"方法。

基本上,我试图实现的是,首先创建一个事务并存储group_id、owner_id、user_id、消息和状态。然后,当用户"接受"请求时,除了状态和消息可以更改之外,将创建一个具有基本相同信息(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传来消息。

希望这能解释我想做什么——如果你有任何建议,请告诉我。

我认为以下代码应该满足您的要求:

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参数,如果他们试图接受一个他们不拥有的请求,那么它也会失败。

相关内容

  • 没有找到相关文章

最新更新