【问题标题】:ActiveAdmin points to wrong to wrong column in select box (name="post[category_id]" should be name="post[cname])ActiveAdmin 在选择框中指向错误的列(name="post[category_id]" 应该是 name="post[cname])
【发布时间】:2016-02-18 13:31:07
【问题描述】:

我开始了一个包含两个模型(帖子和类别)的项目,然后安装了 ActiveAdmin。一切都很好,除了创建新帖子中的“类别”选择框和过滤器“类别”中的选择框(右侧列)。

我的类别模型:

class Category < ActiveRecord::Base
    has_many :posts
end

我的帖子模型

class Post < ActiveRecord::Base
    belongs_to :category
    belongs_to :user
end

我的 admin_user 模型:

class AdminUser < ActiveRecord::Base
   devise :database_authenticatable, 
          :recoverable, :rememberable, :trackable, :validatable
end

app/admin/admin_user.rb:

ActiveAdmin.register AdminUser do
  permit_params :email, :password, :password_confirmation

  index do
    selectable_column
    id_column
    column :email
    column :current_sign_in_at
    column :sign_in_count
    column :created_at
    actions
  end

  filter :email
  filter :current_sign_in_at
  filter :sign_in_count
  filter :created_at

  form do |f|
    f.inputs "Admin Details" do
      f.input :email
      f.input :password
      f.input :password_confirmation
    end
    f.actions
  end

end

app/admin/category.rb:

ActiveAdmin.register Category do
   permit_params :cname
end

app/admin/post.rb:

ActiveAdmin.register Post do
   permit_params :title, :body, :category_id, :user_id, :admin_user_id, :email
end

使用 Chrome 浏览器开发工具中的检查器工具,我在创建新帖子中发现从数据库表中获取的内容:

<select name="post[category_id]" id="post_category_id"><option value=""></option>
<option value="4">#<Category:0x007f61b9658e08></option></select>

它说 name="post[category_id]" 而不是 name="post[cname]" 因为我认为应该在下拉列表(选择框)中显示类别的名称。而是在下拉列表中列出: #

如果我通过选择这个令人困惑的名称创建帖子,则在帖子的显示页面中,类别名称显示为

/admin/categories/4

我已经花了整整两天的时间尝试和错误 ActiveAdmin Intallation,设计版本和 ActiveAdmin 版本的问题,并试图解决这个问题。但是现在我没有任何想法可以修复它。

我已经找到了一些更改标签的方法,或者我认为它会是什么。但我正在寻找的是如何更改 ActiveAdmin 在下拉菜单中显示的内容?据我所知,将通过 ID 找到对象,但我希望下拉列表中显示的 ID 的类别名称 - 而不是 ID。我认为这应该是默认输出,但我得到的是下拉菜单中类似“#”的文本。

如果有多个类别,它在下拉列表中将如下所示:

_________________________________
|_______________________________▼|
 | #<Category:0x007fac18bb1540>  |
 | #<Category:0x007fac18bb0f00>  |
 | #<Category:0x007fac18bb1220>  |
 | #<Category:0x007fac18bb0be0>  |
 | #<Category:0x007fac18bb92f8>  |
 |_______________________________|

我可以做些什么来改变显示这个

'#<Category:...7fac18bb92f8>' 

到下拉列表中的类别名称

【问题讨论】:

  • 您看错了问题 - ActiveAdmin 所做的是正确的。当您想通过表单设置关联时,您传递关联记录的 id。这样它就可以工作了——如果你传递名字,你将不得不做一个愚蠢的查询,比如Post.new({ category_id: Category.find(params[:post][:cname]).id })
  • 您的问题应该是“如何在 ActiveAdmin 中更改关联记录的标签?”
  • 我想到但我发现更改标签是我不确定,我不仅将键“category_id”的名称更改为新的名称,而且值将相同和以前一样。
  • 这是我第一次使用 ActiveAdmin。
  • 你还是不明白。你不应该改变价值。如果您希望输入更改与帖子相关联的类别,请使用类别 ID 传递 post[category_id] - 这不仅在 ActiveAdmin 中,而且在一般的 Rails 中。

标签: ruby-on-rails devise activeadmin


【解决方案1】:

上面的讨论帮助我找到了正确的解决方案。当我阅读 das ActiveAdmin 时,显示对象时会出现有根据的猜测 (Link to were I found it)。它会查找方法关键字,如“:display_name”、“:full_name”、“:name”、“:username”、“:login”、“:title”、“:email”或“to_s”,但不像我的情况对于“:cname”。我所要做的就是在我的模型中生成 to-string 关键字:

我的类别模型

class Category < ActiveRecord::Base
    has_many :posts

    def to_s                       <-
      "#{cname}"                   <-----the solution
    end                            <-

end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 2011-05-31
    • 1970-01-01
    相关资源
    最近更新 更多