Ruby on rails Rails 4将现有/以前的记录值传递给新记录
我会尽可能彻底地解释这一点。我试图找出通过表单传递不应被篡改为隐藏值的现有数据的最佳方式,或者有没有更好的方式将rails上的数据发送到新的“create”方法 基本上,我试图实现的是,首先创建一个事务,并存储组id、所有者id、用户id、消息和状态。然后,当用户“接受”请求时,将创建一个新事务,其中包含基本相同的信息(组id、所有者id和用户id),但状态和消息可以更改 因此,流程如下所示: 用户首先创建如下请求:Ruby on rails Rails 4将现有/以前的记录值传递给新记录,ruby-on-rails,ruby,forms,ruby-on-rails-4,strong-parameters,Ruby On Rails,Ruby,Forms,Ruby On Rails 4,Strong Parameters,我会尽可能彻底地解释这一点。我试图找出通过表单传递不应被篡改为隐藏值的现有数据的最佳方式,或者有没有更好的方式将rails上的数据发送到新的“create”方法 基本上,我试图实现的是,首先创建一个事务,并存储组id、所有者id、用户id、消息和状态。然后,当用户“接受”请求时,将创建一个新事务,其中包含基本相同的信息(组id、所有者id和用户id),但状态和消息可以更改 因此,流程如下所示: 用户首先创建如下请求: Request.create("gid" => 1, "user_id"
Request.create("gid" => 1, "user_id" => 2, "owner_id" => 4, "message" => "Bla Bla", "status" => 'pending')
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
然后,该请求的所有者查看该请求,并能够接受或拒绝该事务。请记住,所有请求都在同一页中,因此在同一页上会有许多接受和拒绝,但每个都会通过@request=requests.where(:owner_id=>4)进行迭代
隐藏输入的问题在于,您可以很容易地对其进行篡改,以更改不应该更改的列。我想弄清楚的是,是否有方法将值传递到accept方法中,使用new(message)和old(group\u id、user\u id、owner\u id)创建新行
新交易基本上如下所示:
Request.create("gid" => 1, "user_id" => 2, "owner_id" => 4, "message" => "Bla Bla", "status" => 'pending')
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的问题是,用户可以修改表单以允许更改此字段。理想情况下,我只想允许:消息从参数传来
希望这能解释我想做什么-如果你有任何建议,请告诉我 我认为以下代码应该满足您的要求:
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
使用此代码,即使有人篡改了request id参数,如果他们尝试接受一个他们不拥有的请求,那么它也会失败。为什么accept函数必须创建一个新请求?您不能简单地将原始请求的“状态”列更新为“已接受”吗?因为如果我们更新了原始记录,那么就不能有来回传递的“消息”的记录,因为这些消息总是唯一的。确定。当某人接受请求时,他们是否需要更改任何属性?或者,除了状态外,新请求是否相同?(据我推测)唯一不同的是消息和状态。ID是唯一的,组ID(gid)、用户ID和所有者ID都基于以前的记录。在这种情况下,客户端不应发送gid和用户ID参数(或忽略)。您不需要它们,因为您可以从原始请求中复制它们。理想情况下,客户机只需在接受请求时向服务器发送请求id和消息。然后,您只需要验证原始请求的所有者id是否等于当前用户的id。