试图将两个属性更新到用户模型,这是我在用户控制器中的当前代码:
def update
@user = User.find(params[:id])
if @user.update_attributes(songkickID: params[:user][:songkickID], jamID: params[:user][:jamID])
redirect_to @user
else
redirect_to @user
end
end
Songkick ID和Jam ID被输入到两个不同的字段中。然而,在当前代码中,如果我尝试自己更新Jam ID,它会更新该属性,但随后重定向到用户页面(如预期),其中Songkick ID现在为零。再次输入Songkick ID后,Jam ID变为零。我想这是因为它们都是控制器中相同if语句的一部分?
我试图为jamID params使用elsif,但它似乎根本无法识别(即不会为用户更新该属性)。还尝试了||条件运算符。
编辑:这是两种不同的形式:
<%= form_for(@user) do |f| %>
<%= f.text_field :jamID, :id=>"jamURL" %>
<%= f.submit "Jam ID", :onclick => "changeImg()", id: "saveJam" %>
<% end %>
和
<%= form_for(@user) do |f| %>
<%= f.text_field :songkickID %>
<%= f.submit "Songkick ID", :type => :image, :src => image_path("songkicklogo.png"), id: "skLogo" %>
<% end %>
我尝试将代码修改为update_column,但我得到了错误数量的参数(1对2)。
第2版:按照Hartl的Rails教程中的布局,我试图定义强参数:
private
def user_params
params.require(:user).permit(:songkickID, :jamID)
end
但是我仍然得到禁止属性错误?
编辑3:以下代码通过了,但我担心它不符合Rails4强参数:
控制器:
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
end
def edit
@user = User.find(params[:id])
end
def user_params
params.require(:user).permit(:songkickID, :jamID)
end
def update
@user = User.find(params[:id])
if @user.update_attributes(user_params)
redirect_to @user
else
redirect_to @user
end
end
end
如果我将update移到update方法下面,我会得到user_params的未定义变量/方法错误,并且我不能将其设为私有。
那么,为什么要在update_attributes中显式命名属性?
您应该能够使用以下内容:
@user.update_attributes(params[:user])
请记住,如果您正确命名了表单字段,params[:user]是一个散列,它已经有了您想要的密钥(:songkickID等)
现在,您将获得两件事中的一件,然后将其传递给update_attributes,如下所示:
{:songkickID => someID}
{:jamID => someOtherID}
它将正确地更新您的用户,并且只更改已传递的用户。
早期代码的问题是,您传递给更新属性的是:
{:songkickID => someID, :jamID => nil}
{:songkickID => nil, :jamID => someOtherID}
这是故意用你传递的nil覆盖另一个id。
OP编辑:谢谢你,这是我的最终控制器代码:
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
end
def edit
@user = User.find(params[:id])
end
def update
@user = User.find(params[:id])
if @user.update_attributes(user_params)
redirect_to @user
else
redirect_to @user
end
end
private
def user_params
params.require(:user).permit(:songkickID, :jamID)
end
end
在最后一种情况下:
def update
if params[:user][:songkickID]
received_param = { songkickID: params[:user][:songkickID] }
elsif params[:user][:jamID]
received_param = { jamID: params[:user][:jamID] }
end
@user.update_attributes(received_param)
redirect_to @user
end
注意:我删除了最后一个条件,因为它对没有用处