在Rails中单独更新属性



试图将两个属性更新到用户模型,这是我在用户控制器中的当前代码:

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

注意:我删除了最后一个条件,因为它对没有用处

相关内容

  • 没有找到相关文章

最新更新