Elixir 长生不老药中的字符串比较
我试图比较Elixir中的字符串位-如果它们相等,则Elixir 长生不老药中的字符串比较,elixir,Elixir,我试图比较Elixir中的字符串位-如果它们相等,则if块触发,或者else块触发 def show(conn, %{"id" => id}) do Logger.info id Logger.info "----------" Logger.info conn.assigns.current_user if conn.assigns.current_user == id do professional = Repo.get!(Profess
if
块触发,或者else
块触发
def show(conn, %{"id" => id}) do
Logger.info id
Logger.info "----------"
Logger.info conn.assigns.current_user
if conn.assigns.current_user == id do
professional = Repo.get!(Professional, id)
render(conn, "show.html", professional: professional)
else
conn
|> put_flash(:error, "You must be logged in for that!")
|> redirect(to: site_path(conn, :index))
|> halt()
end
在上面的示例中,Logger.info id
和Logger.info conn.assigns.current_user
都返回相同的内容,但从未输入if
块
我做错了什么?我猜你的
连接分配。当前用户是一个数字,id
是一个字符串IO.inspect(是二进制的(conn.assigns.current\u user))
正如greg所说,参数中的id很可能是字符串,因此您必须确保您正在比较相同类型的对象。
但我会避免解析为整数,因为它可能会产生一些意外的结果,例如,如果您的id为nil
我不是长生不老药的专家,但以下是我能想到的一些解决方案:
# String interpolation will automatically cast the interpolated values to string
if "#{conn.assigns.current_user}" == "#{id}" do
# Casting to char list can handle nil values as well as strings and integers
if to_char_list(conn.assigns.current_user) == to_char_list(id) do
# Regular to_string
if to_string(conn.assigns.current_user) == to_string(id) do
如果在99%的情况下,多行是一种代码气味。您的代码段可能被重写为:
case to_string(conn.assigns.current_user) do
id ->
render(conn, "show.html", professional: Repo.get!(Professional, id))
_ ->
conn
|> put_flash(:error, "You must be logged in for that!")
|> redirect(to: site_path(conn, :index))
|> halt()
end
我将此作为一个答案,只是为了说明方法,@greg的答案更好
单行if
s通常在其他语言中用作三元组,但:
if a < 42, do: "tiny", else: "huge"
如果a<42,则执行“微小”,否则执行“巨大”
如果conn.assigns.current_user===id do,您是否尝试了以下操作?@Chris-是=
和=
在这段代码中的行为方式相同。我没有足够的代表对另一个答案进行评论,但检查参数的更好方法是使用卫士,when is_binary(id)
防范Nilsh只需解析int。为了熵恒定,复制到这里@格雷格说:“当是二进制(id)
时,检查参数的更好方法是使用警卫,防止nils
,”-这是真的。现在不知道在哪里发表评论^^^^我同意使用if
不是解决问题的灵丹妙药,但是你仍然希望解析为字符串,而不是整数,由于Integer.parse/1将返回{result,rest}
和String.to_Integer/1是对象类型的一个很强的假设,对吗?@Ninigi解析什么和解析规则是由任务定义的,在这种情况下我不是100%清楚。看起来到_string
是这里最好的方法。好的,谢谢,只是要确保我在这里没有完全走错方向:)@Ninigi BTW,case Integer.parse(id)do{current_user,{u}->…
。您的示例存在返回true
的小故障,例如nil
和空二进制文件。但是,只有一个操作数应该是cast.Integer.parse/1,这在很大程度上假设您对ID使用Integer,而对于mongodb来说,情况并非如此。这就是为什么我真的不喜欢转换为int而不是string的想法:)