我有一个会话变量(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
答案 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。