nil类的未定义方法更新

时间:2014-02-21 07:04:20

标签: ruby-on-rails ruby

用户登录后,我正在尝试收集要在数据库中更新的其他信息

这是我的控制器

  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实例变量的概念不熟悉...非常感谢帮助和解释

4 个答案:

答案 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

@userupdate不存在,您需要先创建它,您已经完成了这项工作