【问题标题】:Rails 4 Passing existing/previous record values to new recordRails 4将现有/以前的记录值传递给新记录
【发布时间】:2014-03-06 09:43:55
【问题描述】:

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

基本上我想要实现的是,首先创建一个事务并存储 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) 进行迭代。

隐藏输入的问题在于您可以轻松地篡改它以更改您不应该更改的列。我想弄清楚的是,如果有一种方法可以将值传递给接受方法,同时使用新的(消息)和旧的(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 列入白名单的问题是用户可以修改表单以允许更改此字段。理想情况下,我只想允许 :message 来自参数。

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

【问题讨论】:

  • 为什么accept函数要创建一个新的请求?您不能简单地将状态列更新为接受原始请求吗?
  • 因为如果我们更新了原始记录,那么我们就无法记录来回传递的“消息”,因为它始终是唯一的。
  • 好的。当有人接受请求时,他们是否需要更改任何属性?或者除了状态之外,新请求是否相同? (大概是 id)
  • 唯一不同的是消息和状态。 ID是唯一的,group_id(gid)、user_id和owner_id都是基于之前的记录。
  • 在这种情况下,客户端不应发送 gid 和 user_id 参数(或忽略)。您不需要它们,因为您可以从原始请求中复制它们。理想情况下,客户端应该只发送请求的 ID,并在他们接受请求时向服务器发送消息。那么你只需要验证原始请求的owner_id是否等于当前用户的id即可。

标签: ruby-on-rails ruby forms ruby-on-rails-4 strong-parameters


【解决方案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 参数,如果他们尝试接受不属于他们的请求,也会失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-20
    • 2011-06-23
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    相关资源
    最近更新 更多