simple_form不更新关系

时间:2015-09-21 16:00:36

标签: ruby-on-rails ruby activerecord simple-form

我正在尝试使用simple_form更新用户权限。表单加载时,正确选择当前值。但是在进行更改时,这些更改不会持久保存到数据库中。我正在使用app_ids来分配权限。如果我在rails控制台中做同样的事情,它似乎工作正常。

rails console

u = User.find 3
u. app_ids = [1,3,4]
u.save
# create the user_subscriptions

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

      def update
        @user = User.find(params[:id])
        # binding.pry
        authorize @user
        if @user.update_attributes(user_params)
          flash[:notice] = "Details for #{@user.name} updated."
          redirect_to users_path
        else
          render :edit
        end
      end

    def user_params
      params.require(:user).permit(:name, :role, :app_tokens, :provider, :uid, :app_ids)
    end

应用程序/视图/用户/ _form.html.slim

= simple_form_for(user, html: { class: 'form-horizontal' }) do |form|
  .form-group.full-name.pull-left
    = form.label "Full Name"
    = form.text_field :name, placeholder: "Enter name", class: "form-control"
    = hidden_field_tag "uid", user.id
  p
    = form.label "User Level"
  .btn-group.user-level.pull-left[data-toggle="buttons-radio"]
    = form.input :role, collection: User.roles, as: :radio_buttons, item_wrapper_class: 'btn btn-default', checked: User.roles[user.role], required: true
  .form-group
    .btn-group.btn-group-lg.app-access data-toggle="buttons"
      = form.input :app_ids, collection: App.order(:name), as: :check_boxes, item_wrapper_class: 'btn btn-default'

  .text-center.edit-user-submit.actions
    = link_to "Cancel", users_path, class: "btn btn-primary btn-sm pull-right"
    = form.button :submit, "Save Changes", data: {disable_with: "Updating ..."}, class: "btn btn-default btn-sm pull-right"

应用程序/模型/ user.rb

class User < ActiveRecord::Base
  has_many :user_subscriptions, dependent: :delete_all
  has_many :apps, through: :user_subscriptions

  after_save :update_apps_access

  devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :omniauthable
  attr_reader :app_tokens

  enum role: [:super_admin, :admin, :generic]
  self.per_page = 10

  def app_tokens=(ids)
    self.app_ids = ids.split(',')
  end

  def role=(value)
    if value.is_a?(String) && value.to_i.to_s == value
      super value.to_i
    else
      super value
    end
  end

  def update_apps_access
    return unless role == 'admin' || role == 'super_admin'
    App.all.find_each { |app| user_subscriptions.find_or_create_by(app_id: app.id) }
  end

  def self.from_omniauth(access_token)
    data = access_token.info
    user = User.find_by(email: data['email'])
    user = User.create(
      name: data['name'],
      email: data['email'],
      oauth_token: access_token['credentials']['token'],
      uid: access_token['uid'],
      provider: access_token['provider']
    ) unless user
    user
  end
end

应用程序/模型/ user_subscription.rb

class UserSubscription < ActiveRecord::Base
  belongs_to :user
  belongs_to :app
end

1 个答案:

答案 0 :(得分:3)

因为有多个ID需要允许这样的数组:

def user_params
  params.require(:user).permit(:name, :role, :app_tokens, :provider, :uid, app_ids: [])
end
相关问题