【问题标题】:How to deal with boolean value from form submit?如何处理表单提交的布尔值?
【发布时间】:2020-03-29 02:14:27
【问题描述】:

我们使用复选框在表单中提交布尔数据。

在rails中,当提交表单时,一个带有"1""0"的字符串将被提交给控制器。

在phoenix中,当提交表单时,一个带有"true""false"的字符串将被提交给控制器。

如果我们直接在数据库中创建对象就可以了。任何一个值都将正确存储为布尔值。

但如果我们需要在逻辑中使用布尔值,最好的方法是什么?

  1. 转换为布尔值:
    # Ruby code
    def create
      admin = ActiveModel::Type::Boolean.new.cast(param[:admin])
      if admin
          ....
      end
    end
  1. 直接作为字符串使用:
    # Elixir code
    def create(conn, params) do
      case params[:admin] do
        "true" -> do something
        _ -> do others
      end
    end
  1. 其他更好的方法?

【问题讨论】:

    标签: ruby-on-rails forms elixir phoenix-framework


    【解决方案1】:

    String.to_existing_atom/1 是你的朋友。

    truefalse 都是原子,即:true:false 的语法糖。那是因为在 中它们是原子。

    :true == true
    #⇒ true
    :false == false
    #⇒ true
    
    String.to_existing_atom "true"
    #⇒ true
    

    【讨论】:

    • 感谢您的回答。所以你更喜欢选项1?为什么?
    • 我更喜欢显式转换为原子,而不是cast。但是cast 也更好,因为 a) 2. 对于恶意输入来说太容易出错,即使第二个 case 子句被更正为 "false",dialyzer 也会抱怨 no return,并且 b) 意图是显然是要施放,而不是与从野外收到的任何东西相匹配。另外,我不知道这个Foo::Bar.cast/1 做了什么,我知道String.to_existing_atom/1 可以正常工作。
    • 我的问题集中在设计决策上。 1)在控制器中使用字符串 2)在控制器中转换为布尔值(不关心哪种方法) 3)在 Plug/before_action 中可能吗?
    • 不是 1) 因为正如我所说的那样,恶意输入容易出错。我也不会在Plug 中这样做,因为控制器希望按原样接收查询,而不是已经转换为原子的东西(在 JSON/HTTP 查询中无法表示。)。
    猜你喜欢
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多