Ruby on rails 在Rails 4中显示相应文本\字段\标记值的优雅方式
所以我的问题是用一种简单的方式展示模型所拥有的东西 那么,目前什么有效呢 在我的查看器中,这很好:Ruby on rails 在Rails 4中显示相应文本\字段\标记值的优雅方式,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,所以我的问题是用一种简单的方式展示模型所拥有的东西 那么,目前什么有效呢 在我的查看器中,这很好: <%= text_field_tag(:first_name, (current_user.present? ? current_user : '').first_name.present? ? current_user.first_name : '') %> 在这个控制器中,我可以调用user\u vals(:first\u name)但是得到undefined方法value'`
<%= text_field_tag(:first_name, (current_user.present? ? current_user : '').first_name.present? ? current_user.first_name : '') %>
在这个控制器中,我可以调用user\u vals(:first\u name)
但是得到undefined方法
value'`错误。而且我不能打电话
<%= text_field_tag(:first_name, @user_vals(:first_name)) %>
因为我得到了一些括号语法错误,但这不是真正的问题
所以我的最终目标是有这样的东西:
<%= text_field_tag(:first_name, @user_vals(:first_name)) %>
而不是我上面给出的第一个代码。如何实现这一点?在这种情况下,您可以使用
try
。只要写下:
<%= text_field_tag(:first_name, current_user.try(:first_name)) %>
请参阅:我建议退一步,尝试使用Duck类型来解决此问题 您现在拥有的是一个
当前用户
方法。如果用户未登录,此方法可以返回它想要的任何对象,并且该对象可以响应它想要的任何东西。下面是一个简化的示例:
def current_user
@user || OpenStruct.new(first_name: "")
end
注意:我假设@user
持有当前登录的用户。。。但这可能是对super
的调用,或者根据您的实现而定的任何其他调用
因此,现在,您不必根据从current\u user
方法返回的对象类型进行分支,而只需使用返回的对象即可
current_user.first_name # => Either the User object's first name or `""`
您可以通过创建一个GuestUser类,并返回GuestUser.new
,而不是上面的OpenStruct
,来进一步实现这一点。Guestuser将是一个没有数据库支持的模型,可以根据需要响应任意数量的方法
这一想法也被许多其他人所代表。使用一个类来防止基于nil的重复代码切换实际上有一个名称:特殊情况模式。作为一个快速、免费的示例,请参见。或者,如果您订阅了Ruby Tapas,请务必查看这一集。Avdi Grimm的优秀著作中也深入讨论了这个主题和其他许多主题:,我强烈推荐。profile\u vals的意图是什么??正如预期的那样。您知道我是否可以从另一种方法中执行相同的操作(即仍然使用
user\u vals
方法并传递:first\u name
参数)?如果是这样的话,你能举个例子吗?@SarpKaya:当你想对一个可能是nil
的实例调用一个方法时,你可以使用try
。请参阅我的答案中的文档链接。
current_user.first_name # => Either the User object's first name or `""`