Rails 4 - 更新模型中的特定属性

时间:2014-09-11 16:19:02

标签: ruby-on-rails

我正在构建一个市场应用程序(rails 4),卖家可以列出要销售的商品。我有一个卖家资料表单,用户可以在其中输入有关其品牌的详细信息

我无法通过用户输入更新记录。表单提交时没有任何错误,但模型未更新。

以下代码。在http://mktdemo.herokuapp.com/seller/18进行演示(登录:test@test.com / pwd:test1234)

路线:

match "/seller/:id", to: "users#sellerprofile", via: [:get, :put], as: :sellerprofile

我的表格:

<%= form_for(@user, url: sellerprofile_path(id: current_user.id), method: :put, html: { :class => 'edit_profile', :multipart => true }) do |f| %>

  <div class="form-group">
    <%= f.label :your_story %><i> (required)</i>
    <%= f.text_area :profilestory, class:"form-control" %>
  </div>

  <div class="form-group">
    <%= f.label :profile_image %><i> (required)</i>
    <%= f.file_field :profileimage, class:"form-control" %>
  </div>

   <div class="form-group">
        <%= f.submit class:"btn btn-primary" %>
   </div>

 <% end %>

user_controller:

def sellerprofile
     @user = User.find(params[:id])
     @user.update_attributes(:profilestory => params[:profilestory], :profileimage => params[:profileimage])
end

对于图像,我使用了回形针,并在我的模型中使用了has_attached ...代码。

更新 这是我在控制器中的user_params:

  def user_params
    params.require(:user).permit(:bankaccname, :profileimage, :profilestory)
  end

当我在sellerprofile方法中使用@user.update(user_params)时,我得到params :user not found error。加载表单时出现此错误(不提交)。错误在第params.require(:user)

更新2: 这是更新方法。我将此用于另一个接收某些银行帐户数据的表单,因此我不确定是否可以为个人资料表单修改此内容。

def update
    @user.attributes = user_params
    Stripe.api_key = ENV["STRIPE_API_KEY"]
      token = params[:stripeToken]

      recipient = Stripe::Recipient.create(
        :name => user_params["bankaccname"], 
        :type => "individual",              
        :bank_account => token              
        )                                   

      @user.recipient = recipient.id

     respond_to do |format|
      if @user.save
        format.html { redirect_to edit_user_url, notice: 'Your account was successfully updated.' }
      else
        format.html { render action: 'edit' }
      end
    end
  end

1 个答案:

答案 0 :(得分:1)

如果你看一下你的问题,就说:

  

当我在sellerprofile方法中使用@ user.update(user_params)时,我得到一个参数:用户未找到错误。加载表单(而不是提交)

时会发生此错误

这一行告诉我们在您的表单呈现的操作中有错误。我的意思是您在浏览器地址栏中显示的网址以显示您的表单

在您的评论中,您告诉我,呈现表单的网址为/seller/:id,现在让我们查看您的表单代码

<%= form_for(@user, url: sellerprofile_path(id: current_user.id), method: :put, html: { :class => 'edit_profile', :multipart => true }) do |f| %>

注意表格中使用的网址?您使用相同的操作来呈现表单,然后在提交表单后再次将您带到错误的相同操作。你应该做两个不同的路线。一个用于渲染表单,另一个用于创建表单。要进一步解释,如果你看一下你的代码

 def sellerprofile
   @user = User.find(params[:id])
   @user.update_attributes(user_params) 
 end

因此,当您点击/seller/:id 时,它会将您带到sellerprofile方法,因此您的vendorprofile方法中的代码会启动并尝试更新您的用户,因为此行@user.update_attributes(user_params)但没有user_params,因为你没有提交任何表格,所以你得到一个参数:用户找不到错误

<强>修正:

只需制作两个不同的路线,一个用于渲染表单,另一个用于创建记录:

match "/seller/:id/new", to: "users#sellernew", via: [:get], as: :sellernewprofile
match "/seller/:id", to: "users#sellerprofile", via: [:put], as: :sellerprofile