Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Rails 4中显示相应文本\字段\标记值的优雅方式_Ruby On Rails_Ruby_Ruby On Rails 4 - Fatal编程技术网

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 `""`