用户登录后,我正在尝试收集要在数据库中更新的其他信息
这是我的控制器
def show
@user = User.find(params[:id])
end
def new
@user = User.new
end
def additional_info
@user = User.find params[:id]
end
def update
if @user.update(user_addinfo)
redirect_to user_path(@user), notice: 'User was successfully updated.'
else
render action: 'additional_info'
end
end
def create
@user = User.new(user_params)
if @user.save
#session[:user_id] = @user.id
#UserMailer.welcome_email(@user).deliver
sign_in @user
redirect_to additional_info_path(@user)
flash[:success] = "Welcome to InYourShoes!"
else
render'new'
end
end
private
def user_params
params.require(:user).permit(:name, :email, :password, :password_confirmation)
end
def user_addinfo
params.require(:user).permit(:year)
end
end
如果@ user.update(user_addinfo),rails表示未定义,则在def更新函数中发生错误。 def user_addinfo是一个动作方法,def additional_info是实际页面
页面视图:
<div class="row">
<div class="col-xs-12 col-sm-6 col-sm-offset-3">
<%= form_for(@user, :html => {:class => 'form-horizontal'}) do |f| %>
<fieldset>
<p>Do you have experience in Business? If yes, select one of the following:
<div class="input-group">
<div class="input-group-btn">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">Select one <span class="caret"></span></button>
<ul class="dropdown-menu">
<li><a href="#">Entrepreneurship</a></li>
<li><a href="#">Investments</a></li>
<li><a href="#">Management</a></li>
<li class="divider"></li>
<li><a href="#">All of the Above</a></li>
</ul>
</div><!-- /btn-group -->
<%= f.text_field :year , :class => "form-control", :placeholder => "Years of experience" %>
</div>
</p>
<div class = "center form-actions">
<%= f.submit "Submit", class: "btn btn-lg btn-primary" %>
</div>
</fieldset>
<% end %>
</div>
</div>
我是否将@user保存在错误的位置?我仍然对@variablename实例变量的概念不熟悉...非常感谢帮助和解释
答案 0 :(得分:0)
这是因为你没有在“update”方法中初始化@user。
通常你需要像“show”方法那样做。
@user = User.find(params[:id])
您当前的代码,“update”方法中的@user是nil,因为您没有为其分配任何值。而“nil”变量没有“update”方法。
答案 1 :(得分:0)
您可能不应该尝试重载更新功能以捕获编辑和更新的功能(您正在做的事情,其他答案忽略了这一点)。但是提交表单时@user
为零的原因可能是因为这一行:
render action: 'additional_info'
我猜这条线没有按照你的预期行事。我认为这不仅仅是运行addition_info
动作并渲染表单,而是执行渲染。您可能希望redirect_to 'additional_info'
并根据需要为其添加路线。然后,您可以确保表单正确地将@user
对象提交回更新函数。
答案 2 :(得分:0)
在更新之前,您必须获取用户的其他信息
def update
@user = User.find(params[:id])
if @user.update_attributes(user_addinfo)
#your redirection
else
#your redirection
end
end
答案 3 :(得分:0)
def update
self.additional_info
if @user.update(user_addinfo)
redirect_to user_path(@user), notice: 'User was successfully updated.'
else
render action: 'additional_info'
end
end
@user
与update
不存在,您需要先创建它,您已经完成了这项工作