尝试使用iron和mime设置响应的内容类型时,“未实现iron :: Modifier <response>”

时间:2019-01-02 13:50:21

标签: rust mime iron

我正在尝试运行O'Reilly出版的《 Programming Rust 》一书中的示例,但我坚持使以下代码成功编译:

Cargo.toml

[package]
name = "gcd-online"
version = "0.1.0"
authors = ["Jignesh Gohel <abc@example.com>"]
edition = "2018"

[dependencies]
iron = "0.6.0"
mime = "0.3.12"
router = "0.6.0"
urlencoded = "0.6.0"

/src/main.rs

extern crate iron;
extern crate mime;

use iron::prelude::*;
use iron::status;

fn main() {
    println!("Serving on http://localhost:3000...");
    Iron::new(get_form).http("localhost:3000").unwrap();
}


fn get_form(_request: &mut Request) -> IronResult<Response> {
    let mut response = Response::new();

    response.set_mut(status::Ok);
    response.set_mut(mime::TEXT_HTML_UTF_8);
    response.set_mut(r#"
        <title>GCD Calculator</title>
        <form action="/gcd" method="post">
            <input type="text" name="n" />
            <input type="text" name="m" />
            <button type="submit">Compute GCD</button>
        </form>
    "#);

    Ok(response)
}

输出

   Compiling gcd-online v0.1.0 (~/oreilly-programming-rust-book-examples/chapter-1/gcd-online)                                                          
error[E0277]: the trait bound `mime::Mime: iron::modifier::Modifier<iron::Response>` is not satisfied                                                                           
  --> src/main.rs:17:14                                                                                                                                                         
   |                                                                                                                                                                            
17 |     response.set_mut(mime::TEXT_HTML_UTF_8);                                                                                                                               
   |              ^^^^^^^ the trait `iron::modifier::Modifier<iron::Response>` is not implemented for `mime::Mime`

我的 Cargo.toml 使用最新版本的依赖关系,但是图书作者使用以下版本

[dependencies]
iron = "0.5.1"
mime = "0.2.3"
router = "0.5.1"
urlencoded = "0.5.0"

以及其中一部分作者使用了以下代码

#[macro_use] extern crate mime;

fn get_form(_request: &mut Request) -> IronResult<Response> {
    let mut response = Response::new();

    response.set_mut(mime!(Text/Html; Charset=Utf8));

    Ok(response)
}

我认为版本之间的差异是导致编译错误的原因。

我试图浏览ironmime板条箱的文档,但我想不出如何克服这个错误。

1 个答案:

答案 0 :(得分:0)

您已经注意到, mime iron 的最新版本与本书中的示例代码不兼容。 issue was raised on the official book's repository

您可以使用旧的 mime 板条箱,但从长远来看,最好使用 iron 板条箱中的 mime {{ 3}}。

对于 iron 0.6.0,您可以替换有问题的行:

resource

ActiveAdmin.register User do
  controller do
    def show
      @user = User.find(params[:id])
      show! 
    end
  end

  show do
    attributes_table do
      row "User" do
        # note that your have access to `user` as a method.
        link_to user.display_name, user_path(user.slug) 
      end
    end
  end
end

具有以下之一:

response.set_mut(mime::TEXT_HTML_UTF_8);

response.set_mut(mime!(Text/Html; Charset=Utf8));