优点 gem - 显示特定徽章和获得该徽章的用户
Merit gem - Display a specific badge and the users who obtained it
我想创建一个方法 badges#show
就像在 Whosebug 中完成的那样,其中显示了选定的徽章和获得徽章的用户。我创建了一个 BadgesController
,其中包含以下内容:
# Find badge
before_action :set_badge, only: %i[show]
# GET /badges/1
def show; end
private
# Set badge
def set_badge
@badge = Merit::Badge.find(params[:badge_id])
end
在merit.rb
中(我只显示下面第一个徽章的代码):
# Use this hook to configure merit parameters
Merit.setup do |config|
# Check rules on each request or in background
# config.checks_on_each_request = true
# Define ORM. Could be :active_record (default) and :mongoid
# config.orm = :active_record
# Add application observers to get notifications when reputation changes.
# config.add_observer 'MyObserverClassName'
# Define :user_model_name. This model will be used to grand badge if no
# `:to` option is given. Default is 'User'.
# config.user_model_name = 'User'
# Define :current_user_method. Similar to previous option. It will be used
# to retrieve :user_model_name object if no `:to` option is given. Default
# is "current_#{user_model_name.downcase}".
# config.current_user_method = 'current_user'
end
Merit::Badge.create!(
id: 1,
name: 'just-registered',
description: 'New member',
custom_fields: {
icon_tag: 'user',
category: 'user'
}
)
# More badges [...]
但是,当我尝试通过 <%= @badge.name %>
显示徽章名称时,我得到以下信息:
undefined method 'name' for #<#<Class:0x000000001290cc18>:0x000000000c8c9d10>
.
我在调用 badges#show 方法时传递的 params 是 1(在url中:/badges/1)。
以下行抛出相同的错误:
@badge = Merit::Badge.find_by_id(params[:badge_id])
@badge = Merit::Badge.find_by_id(params[:id])
@badge = Merit::Badge.find(params[:id])
如果我将 @badge = Merit::Badge.find(params[:badge_id])
更改为 @badge = Merit::Badge.find(:id)
,我会得到:Could not find Merit::Badge with key "id"
.
当我尝试调试我的代码时,视图中的 <%= debug @badge %>
会发生以下情况(@badge = Merit::Badge.find(params[:badge_id])
):
#<#<Class:0x000000000da762c0>:0x000000000af48a80 @keys=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49], @mapper=#<Ambry::Mapper:0x000000000af48f58 @klass=Merit::Badge(id, name, level, description, custom_fields), @adapter_name=:main, @indexes={}, @lock=#<Thread::Mutex:0x000000000af48d28>, @options={}, @hash={1=>{:id=>1, :name=>"just-registered", :level=>nil, :description=>"New member", :custom_fields=>{:icon_tag=>"user", :category=>"user"}} [...]
它显示了一个散列,其中包含我在初始化文件 merit.rb
中的所有徽章。我不明白为什么控制器没有传递 id 参数。
<%= @badge.find(1).name %>
在视图中工作正常。
我做错了什么?
提前致谢!
我终于成功了!
这是我的解决方案:
在badges_controller.rb
中:
class BadgesController < ApplicationController
# GET /badges/1
def show; end
private
# Set badge
def set_badge
@badge = Merit::Badge.find(params[:badge_id])
@id = @badge.keys[params[:id].to_i]
@badge = @badge.find(@id)
end
end
然后在视图 show.html.erb
中,可以根据文档调用常用方法:
<%= @badge.name %>
<%= @badge.description %>
<% @badge.users.each do |user| %>
<%= user.full_name %>
<%= (user.sash.badges_sashes[params[:id].to_i].created_at).to_formatted_s(:long) %>
<% end %>
有关信息,路径必须 badge_path(badge.id - 1)
才能重定向到正确的徽章(数组从 0 开始)。
我想创建一个方法 badges#show
就像在 Whosebug 中完成的那样,其中显示了选定的徽章和获得徽章的用户。我创建了一个 BadgesController
,其中包含以下内容:
# Find badge
before_action :set_badge, only: %i[show]
# GET /badges/1
def show; end
private
# Set badge
def set_badge
@badge = Merit::Badge.find(params[:badge_id])
end
在merit.rb
中(我只显示下面第一个徽章的代码):
# Use this hook to configure merit parameters
Merit.setup do |config|
# Check rules on each request or in background
# config.checks_on_each_request = true
# Define ORM. Could be :active_record (default) and :mongoid
# config.orm = :active_record
# Add application observers to get notifications when reputation changes.
# config.add_observer 'MyObserverClassName'
# Define :user_model_name. This model will be used to grand badge if no
# `:to` option is given. Default is 'User'.
# config.user_model_name = 'User'
# Define :current_user_method. Similar to previous option. It will be used
# to retrieve :user_model_name object if no `:to` option is given. Default
# is "current_#{user_model_name.downcase}".
# config.current_user_method = 'current_user'
end
Merit::Badge.create!(
id: 1,
name: 'just-registered',
description: 'New member',
custom_fields: {
icon_tag: 'user',
category: 'user'
}
)
# More badges [...]
但是,当我尝试通过 <%= @badge.name %>
显示徽章名称时,我得到以下信息:
undefined method 'name' for #<#<Class:0x000000001290cc18>:0x000000000c8c9d10>
.
我在调用 badges#show 方法时传递的 params 是 1(在url中:/badges/1)。
以下行抛出相同的错误:
@badge = Merit::Badge.find_by_id(params[:badge_id])
@badge = Merit::Badge.find_by_id(params[:id])
@badge = Merit::Badge.find(params[:id])
如果我将 @badge = Merit::Badge.find(params[:badge_id])
更改为 @badge = Merit::Badge.find(:id)
,我会得到:Could not find Merit::Badge with key "id"
.
当我尝试调试我的代码时,视图中的 <%= debug @badge %>
会发生以下情况(@badge = Merit::Badge.find(params[:badge_id])
):
#<#<Class:0x000000000da762c0>:0x000000000af48a80 @keys=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49], @mapper=#<Ambry::Mapper:0x000000000af48f58 @klass=Merit::Badge(id, name, level, description, custom_fields), @adapter_name=:main, @indexes={}, @lock=#<Thread::Mutex:0x000000000af48d28>, @options={}, @hash={1=>{:id=>1, :name=>"just-registered", :level=>nil, :description=>"New member", :custom_fields=>{:icon_tag=>"user", :category=>"user"}} [...]
它显示了一个散列,其中包含我在初始化文件 merit.rb
中的所有徽章。我不明白为什么控制器没有传递 id 参数。
<%= @badge.find(1).name %>
在视图中工作正常。
我做错了什么?
提前致谢!
我终于成功了!
这是我的解决方案:
在badges_controller.rb
中:
class BadgesController < ApplicationController
# GET /badges/1
def show; end
private
# Set badge
def set_badge
@badge = Merit::Badge.find(params[:badge_id])
@id = @badge.keys[params[:id].to_i]
@badge = @badge.find(@id)
end
end
然后在视图 show.html.erb
中,可以根据文档调用常用方法:
<%= @badge.name %>
<%= @badge.description %>
<% @badge.users.each do |user| %>
<%= user.full_name %>
<%= (user.sash.badges_sashes[params[:id].to_i].created_at).to_formatted_s(:long) %>
<% end %>
有关信息,路径必须 badge_path(badge.id - 1)
才能重定向到正确的徽章(数组从 0 开始)。