Rails - ActionController ::参数包含带有表单值的控制器值

时间:2014-10-23 23:10:04

标签: ruby-on-rails parameters actioncontroller

我有一个会话变量(user_id),我想将其作为外键包含在用户正在插入的记录中。我将表单值全部通过表单提交给我的控制器的entity.update(params)方法,使用默认的params定义没有问题。该代码看起来像

 def brand_params
    @brand_params = params.require(:brand).permit(:name, :brand_type, :profile_id)
  end

更新方法类似于

if @brand.update(brand_params)
        format.html { redirect_to @brand, notice: 'Widget was successfully updated.' }
        format.json { render :show, status: :ok, location: @brand }
      else
        format.html { render :edit }
        format.json { render json: @brand.errors, status: :unprocessable_entity }
      end

现在我想将:profile_id会话变量附加到@brand_params并跟随其他线程,我尝试了一个setter方法:

def set_brand_params(key, val)
    if @brand_params != nil
      @brand_params[key] = val
    end
  end

但是,调用它,@ brand_params总是为零。尝试直接添加到brand_params哈希不起作用,因为它是一种更好的方法。如果有更好的方法来满足这个(我假设常见的)用例,我全都耳朵!否则,我想知道为什么var总是为零,尽管在这种情况下,至少brand_params方法认为它是定义的和有价值的。我在Adding a value to ActionController::Parameters on the server side

中得到了这个解决方案

以下是所要求的更新方法:

def update
    puts "update"
    set_brand_params("profile_id", session[:prof])
    respond_to do |format|
      if @brand.update(brand_params)
        format.html { redirect_to @brand, notice: 'Widget was successfully updated.' }
        format.json { render :show, status: :ok, location: @brand }
      else
        format.html { render :edit }
        format.json { render json: @brand.errors, status: :unprocessable_entity }
      end
    end
  end

1 个答案:

答案 0 :(得分:0)

我不同意将您的数据与参数合并。因为您必须只允许您希望用户更新的字段。在这种情况下,您不希望用户更新品牌profile_id,这是一种安全性最佳做法。

然后brand_params必须是:

def brand_params
  @brand_params = params.require(:brand).permit(:name, :brand_type)
end

您的方法更新可能是这样的:

def update
  @brand = Brand.find(params[:id])
  @brand.assign_attributes(profile_id: session[:prof])
  respond_to do |format|
    if @barnd.update(brand_params)
      format.html { redirect_to @brand, notice: 'Widget was successfully updated.'}
      format.json { render :show, status: :ok, location: @brand }
    else
      format.html { render :edit }
      format.json { render json: @brand.errors, status: :unprocessable_entity }
    end
  end
end

您根本不需要set_brand_params方法。

如果没有这个诀窍,请发布入口控制器,我希望我们能找到问题。

编辑:添加respond_to。