【问题标题】:The role of Tuple in PlayFrameworkTuple 在 PlayFramework 中的作用
【发布时间】:2016-11-05 06:56:00
【问题描述】:

现在我正在使用 play2.2.1,我知道 Java,但我不知道 Scala。 如果你稍微学习一下 PlayFramework,你就会知道 Scala 在框架中的使用在一定程度上。这只是关于我的背景。问题是为什么在下面的代码中使用 Tuple2 虽然传递值的数量不是复数。

这是控制器的代码:

//Action for making a message
    public static Result add() {
        Form<Message> f = new Form(Message.class);
        List<Member> mems = Member.find.select("name").findList();
        List<Tuple2<String, String>> opts =
                            new ArrayList<Tuple2<String, String>>();
        for(Member mem: mems) {
            opts.add(new Tuple2(mem.name, mem.name));
        }
        return ok(add.render("fill-in form", f, opts));
    }

这是模型的代码:

@Entity
public class Member extends Model {

    @OneToMany(cascade = CascadeType.ALL)
    public List<Message> messages = new ArrayList<Message>();

    @Id
    public Long id;

    @Required(message = "This item is Required")
    public String name;

    @Email(message = "Please Fill in a message")
    public String mail;

    public String tel;

    public static Finder<Long, Member> find = new Finder<Long, Member>(Long.class, Member.class);

    @Override
    public String toString() {
        String ids = "{id:";
        for (Message m: messages) {
            ids += " " + m.id;
        }
        ids += "}";
        return ("[id:" + id + ", message:" + ids + ", name:" + name + ", mail:" + mail + ", tel:" + tel + "]");
    }

    public static Member findByName(String input) {
        return Member.find.where().eq("name", input).findList().get(0);
    }
}

这是视图的代码:

@(msg:String, form1: Form[models.Message], opts: List[Tuple2[String, String]])

@main("Sample page") {
    <h1>ADD MESSAGE</h1>
    <p>@msg</p>
    @helper.form(action = routes.Application.create) {

    @(helper.select (
        field = form1("name"),
        options = opts
        ))

    @(helper.textarea (
        field = form1("message")
        ))

    <input type="submit">
    }
}

再一次,为什么 Tuple2 包含两个 String 值,尽管有一个值从控制器传递到视图? 如果我在这里展示的信息还不够,请给我评论。

【问题讨论】:

  • Scala 在“某种程度上”中未使用。 Play Framework 是用 Scala 编写的,主要是 Scala。并且还有一个Java API。而tuplekey-value pairs 最自然的结构之一,而那个特定的list 看起来像key-value pairs 的列表。我觉得这条线 - opts.add(new Tuple2(mem.name, mem.name)) 应该是 - opts.add(new Tuple2("name", mem.name))
  • 确实,我尝试按照您说的进行更改。而且效果很好。那么,这里 Tuple 的第一个参数是什么意思呢?您展示的代码是有意义且有说服力的。但是,“opts.add(new Tuple2(mem.name, mem.name))”也可以,但是为什么呢?第一个参数没有任何重要意义?
  • 基本上new Tuple2("abc", "def") 会创建一个Tuple2[String, String] 的实例。 Tuple 是一个通用结构,如 ListMap。以Map[String, String] 为例。 Map[String, String] 本身没有任何意义。它只是由key 映射的values 的持有者。它将始终与您将如何使用该地图有关。
  • 我明白了。我能理解你说的话。虽然我说它工作得很好,但现在我已经确认当我像你现在所说的那样写时编译失败。这意味着 "opts.add(new Tuple2(mem.name, mem.name))" 是可以的,但是 "opts.add(new Tuple2("name", mem.name))" 会导致错误。错误消息是这样的:IndexOutOfBoundsException: Index: 0, Size: 0return Member.find.where().eq("name", input).findList().get(0); 这意味着当代码是你的时,传递变量“name”会以某种方式失败。那么,你能解释一下吗?
  • 该代码是您使用Tuple 的地方,因此您必须根据创建它的方式使用它。就像当您有一个 Map 包含值 def 的键 abc 时,您必须执行 map.get("def") 才能获得 abc;其他任何事情都行不通。

标签: scala playframework playframework-2.2


【解决方案1】:

元组的作用是在单个实例中提供多个值。也许它有点像一个未命名的类?总结一下cmets并给出一个清晰的例子,&lt;select&gt;结构中&lt;option&gt;标签的结构是

<option value="internal-value">shown-value</option>

我们经常将它用于外键情况 - 外键值在“内部值”中,链接表中的名称或其他属性在显示值中。

如果你使用 play helper @select 来生成它,你应该提供一个 tuple2s 的 Seq - 即每个选项两个字符串。第一个用于内部值,第二个用于显示值。我使用defining,但这只是一种方法。例如:

@defining(for (a <- AppType.all()) yield (a.id.toString,a.name)) { appTypeList =>
    @select(
        apiForm("forApp"),
        appTypeList,
        'class -> "form-control",
        '_default -> "-- None Selected --",
        '_label -> "App Type"
    )
}

如果您有一些特殊需要或不使用帮助器的原因,您可以自己手动生成它(或者您可以编写自己的帮助器:))。例如:

<select name="forApiType" id="forApiType">
    @ApiType.all().map { a =>
      <option value="@a.id" @if(a.id==apiType.id) {selected}>
        @a.name
      </option>
    }
</select>

【讨论】:

  • 在你的解释中,我无法理解外键的意义。当然,我知道外键是什么,但我无法理解。请给我补充信息。在您的代码中,似乎没有“元组”。所以,我很困惑。你展示代码是因为你解释了“Tupple”?
  • yield (a.id.toString,a.name) 产生一个类型为 (String,String) 的 Tuple2 列表,这是 @select 帮助器所需要的。在外键情况下,比如地址表上的 fk_country_id 列,您想要显示国家名称列表(显示值),但在表单上您想要存储 country_id(内部值)。这有助于解释吗? (在我的第二段代码中,我不使用元组。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
  • 1970-01-01
相关资源
最近更新 更多