PATCH使用错误的型号ID

时间:2015-10-18 02:16:18

标签: ruby-on-rails ruby

我遇到了以下问题

screenshot

我的编辑功能使用id 33保存模型对象作为id 32,我不知道为什么。 这是我的控制器功能:

def update
    @user = User.find_by_id(session[:user_id])
    @user.ranks[0].update(user_params)
    redirect_to dashboard_ranks_path
end

private
def user_params
    params.require(:rank).permit(:points, :rank_name, :id)
end

同样的方法适用于另一个控制器,但在这个控制器上由于某种原因它突然不起作用。例如,我有3个帖子,我编辑第一个,它不会更改ID,它将成功编辑自己。然而,如果我选择第二个,它会选择第三个的id,如果我编辑第三个,它会以某种方式修补第一个。有人之前有这样的错误吗?

2 个答案:

答案 0 :(得分:2)

您是否有多台运行应用程序的服务器?您使用的是数据库/ redis支持的会话存储吗? 特别是,您获得排名用户关联的方式似乎是问题所在。理想情况下,你会做类似

的事情
rank = @user.ranks.find_by_id params[:rank][:id]
rank.update(user_params) if rank

与此问题无关,但我建议将user_params的名称更改为rank_update_params或其他代表其目的的内容。

修改

这两个第一个问题与了解您正在编辑的等级的用户是否与您从会话中访问的用户相同。

答案 1 :(得分:1)

您因为未使用排名id变量而导致错误...

@user = User.find_by_id session[:user_id]
@user.ranks[0].update user_params #-> how do you know which rank is first?
redirect_to dashboard_ranks_path

您最好做以下事情:

@user = User.find session[:user_id] #-> find uses id anyway, and even then "find_by :attribute" is the `Rails 4` way of doing it
@rank = @user.ranks.find params[:id]
@rank.update user_params

这将根据您通过路线的rank变量选择params[:id]

/ranks/edit/33