Rails 4 + ActiveAdmin将params传递给另一个模型并创建一个对象(带有关系)

时间:2013-12-14 19:02:32

标签: ruby-on-rails-4 activeadmin strong-parameters

这里的Rails新手,只是来自PHP。

我正在运行Rails4 + Active Admin设置(设备/ cancan(现在忽略这些)。 实现strong_parameters。请注意,代码完全坏了。我已经尝试了很多种方式,这就像我得到的那样接近。希望它能让我了解我正在尝试做的事情。

遵循实施API密钥设置的教程,并尝试修改它以便能够为管理员中的用户生成APIKey。 我已向AdminUser添加了一列以生成APIKey 它正确链接到

#app/admin/admin_users.rb
ActiveAdmin.register AdminUser do
  index do 
      column :email
      column :current_sign_in_at
      column :last_sign_in_at
      column :sign_in_count
      default_actions
      column('API', :sortable => :id) { |resource|  link_to  "(Re)Generate Key",  new_admin_admin_user_api_key_path(resource.id)   }  
  end
end

这给了我一个(正确的)链接 /管理/ admin_users /:admin_user_id / api_keys /新(:格式)

# app/admin/api_key.rb
ActiveAdmin.register APIKey do
  belongs_to :admin_user

  controller do
    def create_for admin_user
      key = APIKey.new
      key.assign_params_from_controller(admin_user)
      APIKey.create(:admin_user_id => params[:admin_user_id]);
    end

    def permitted_params
      params.permit create_for [:admin_user_id]
    end
  end
end


#app/models/api_key.rb
class APIKey < ActiveRecord::Base  
before_create :generate_access_token
belongs_to :admin_user, :foreign_key => "id", :inverse_of => :api_key
attr_accessible :admin_user_id

def assign_params_from_controller(params)
  @params = params
end
private
def generate_access_token
  begin
    self.admin_user_id = params.admin_user_id
    self.access_token = SecureRandom.hex
  end while self.class.exists?(admin_user_id: admin_user_id, acces_token: access_token)
end

这段代码告诉我:

NameError in Admin::APIKeysController#new
undefined local variable or method `params' for #<APIKey:0x000000078d6470>

def generate_access_token
  begin
    self.admin_user_id = params.admin_user_id
    self.access_token = SecureRandom.hex
  end while self.class.exists?(admin_user_id: admin_user_id, acces_token: access_token)
end

更新,答案:

问题解决了。

结束了正确的轨道。但由于类型转换错误而导致偏离。 我的admin_user_id最终成为数据库中的“字符串”。那里很好的复制粘贴工作。 首先写了一个迁移

class AlterTableAPIKeys < ActiveRecord::Migration
  def up
    execute "DELETE FROM `api_keys` WHERE 1"

    change_column :api_keys, :access_token,  :string, { null: false } 
    change_column :api_keys, :admin_user_id,  :integer, { null: false } 
    add_column :api_keys, :active, :boolean, {null: false, default: true }
    remove_column :api_keys, :role

    add_index :api_keys, ["admin_user_id"], name: "index_api_keys_on_admin_user_id", unique: false
    add_index :api_keys, ["access_token"], name: "index_api_keys_on_access_token", unique: true
  end
end

我没有将access_token传递给create。

我最终得到了这个。

# app/admin/api_key.rb
ActiveAdmin.register APIKey do
  belongs_to :admin_user
  controller do
    def new 
      key = APIKey.create(:admin_user_id => params[:admin_user_id])
        {:access_token => key.access_token}
      redirect_to admin_admin_users_path, :notice => "API Key #{key.access_token} created! " 
    end
    def permitted_params
      params.permit api_key: [:admin_user_id]
    end
  end
end

# app/models/api_key.rb
class APIKey < ActiveRecord::Base
  attr_accessible :access_token, :expires_at, :admin_user_id, :active, :application
  before_create :generate_access_token
  before_create :set_expiration
  belongs_to :admin_user

  def expired?
    DateTime.now >= self.expires_at
  end

private
  def generate_access_token
    begin
      self.access_token = SecureRandom.hex
    end while self.class.exists?(access_token: access_token)
  end

  def set_expiration
    self.expires_at = DateTime.now+30
  end

显然这不考虑访问权限,可以用角色来解决(即uberadmin可以重新生成其他管理员API,管理员只能自己)。

0 个答案:

没有答案