Rails:通过AJAX重新渲染部分来更新自定义属性

时间:2017-03-10 13:33:01

标签: ruby-on-rails ruby ajax

我有phone的自定义字段User未存储在数据库中,因为我将其用于其他目的。每个字段都有不同的部分,可以通过AJAX自行更新。这就是我在UsersController中处理它的方法:

应用程序/控制器/ users_controller.rb

def update
  @user = ...
  if @user.update_attributes(params[:user])
    respond_to do |format|
      format.json { render json: {html: render_to_string partial: 'edit_field', locals: { user: @user }} }
    end
  end
end

我在自定义用户模型属性phone中提供了custom_attrs参数:

应用程序/模型/ user.rb

include UserConcern
...
attr_accessor :custom_attrs
...
# I've shorten this method, so that you can get the idea, might not work in reality
def update_attributes
  self.custom_attrs[:phone] = self.phone
end

在我在控制器中返回响应之前,我无法将其添加到@user对象,我得到ActiveModel::MissingAttributeError: can't write unknown attribute 'phone'

在我看来,phone字段值是由UserConcern中的方法设置的:

应用程序/模型/关切/ user_concern.rb

def phone
  self.phone = fetch_phone(user) # this method returns the users' phone value
end

当我更新手机并重新呈现部分时,它仍然具有相同的值,因为@user对象没有phone,因为它不是模型中的字段。

我也不能send("phone=", value),因为控制器中没有这样的方法(导致NoMethodError: undefined method 'phone_number_mobile=' for #<UsersController:

那么 - 如何通过phone或UserConcern将@user的值设置为新更新的对象@user.custom_attrs

1 个答案:

答案 0 :(得分:0)

有一种更简单的方法。

应用程序/模型/ user.rb

...
attr_accessor :phone
...

然后,您可以访问user.phone