在此示例中,我真的很喜欢Razor函数的便利性,在该函数中它查询ASP.NET数据库以查看当前用户是否具有“标准”角色。
Sidekiq::Testing.inline! do
expect { worker.perform_async(sms_message.id) }.to raise_error { |error|
expect(Rails.logger).to receive(:error).and_call_original
}
end
我想找到一种创建/使用类似函数的方法,该函数在“组织”数据库表中查找用户所属的组织。
我似乎找不到合适的解决方案。
答案 0 :(得分:1)
您不应该将业务逻辑真正放入视图中。
解决方案取决于您要实现的目标。如果您需要检查当前用户所处的角色,我会向ViewModel添加一个属性,名为UserRoles
,其中包含当前用户所处的所有角色。
ViewModel的伪代码:
public class SomethingViewModel
{
public IReadOnlyCollection<string> UserRoles { get; set; } // could be ICollection, IList, etc. depending on your coding style
// Other properties
}
在您的控制器中:
// this implementation is for Asp.Net Identity, use whatever implementation you need.
private IEnumerable<string> UserRoles
=> ((ClaimsIdentity)User.Identity).Claims
.Where(c => c.Type == ClaimTypes.Role)
.Select(c => c.Value)
public ActionResult SomeAction()
{
// do some processing
var viewModel = new SomethingViewModel()
{
UserRoles = UserRoles.ToList()
}
return View(viewModel);
}
然后在“视图”中使用此属性:
@if (Model.UserRoles.Contains("Standard")) {/* do something*/}
通过这种方式,业务逻辑与视图分离,例如,如果您更改角色的存储方式,则只需简单地交换上面的属性,而不必担心查看角色的方式用于。
当然,您可能希望潜在地缓存UserRoles等,此代码只是主要思想的演示。
答案 1 :(得分:0)
谢谢大家。我最终从视图中调用RenderAction(),并在控制器内部,根据数据库结果返回了PartialView()。这使我可以根据数据库中Organization表的结果返回必要的HTML。