【问题标题】:Using jquery ajax post to submit a POST request in Phoenix FrameworkPhoenix Framework中使用jquery ajax post提交POST请求
【发布时间】:2015-09-09 20:07:28
【问题描述】:

我们希望使用我们的内容可编辑,利用生成的路由以及 router.ex 中的以下内容:

  pipeline :browser do
    plug :accepts, ["html"]
    plug :fetch_session
    plug :fetch_flash
    plug :put_secure_browser_headers
  end

  pipeline :api do
    plug :accepts, ["json"]
  end
  scope "/", TextEditor do
    pipe_through :browser # Use the default browser stack

    get "/", PageController, :index
    resources "/posts", PostController
  end

和控制器功能,即创建:

  def create(conn, %{"post" => post_params}) do
    changeset = Post.changeset(%Post{}, post_params)

    case Repo.insert(changeset) do
      {:ok, _post} ->
        conn
        |> put_flash(:info, "Post created successfully.")
        |> redirect(to: post_path(conn, :index))
      {:error, changeset} ->
        render(conn, "new.html", changeset: changeset)
    end
  end

但是我们不想使用生成的表单,然后我们尝试使用 div 和 jquery 方法 $.post 进行测试:

<div id="newPost" contenteditable="true">write here</div>
<div id="button" class="btn btn-primary">Save</div>

<script type="text/javascript">
$(document).ready(function(){
  $("#button").click(function() {
    var post = $("#newPost").html();

    $.post( "/posts/post", { title: post })
     .done(function() {
        alert( "Data Loaded: " );
    });
  });
});
</script>

但是,我们没有收到警报或任何数据插入到我们的数据库中。 我们缺少什么?

编辑:在浏览器管道中,由于 csrf 令牌错误,我们删除了交叉伪造插件。

【问题讨论】:

  • 您的控制台是否有任何错误?能否请您发布您的browser 管道?
  • 没有错误。在控制台中我们得到:[info] POST /posts/post。我将浏览器管道添加到问题中。由于 csrf 令牌错误,我们删除了交叉伪造插件。
  • 并不是说您应该将其作为解决方案,但是如果您删除:put_secure_browser_headers,您能否检查它是否有效?
  • 我测试过,删除它不起作用。
  • 我们也遇到了参数问题,这就是我们将“post”添加到“/posts/”(“/posts/post”)的原因。

标签: jquery ajax elixir phoenix-framework


【解决方案1】:

尝试以下方法:

$.post( "/posts", { post: { title: post } })

您的控制器希望参数嵌套在 post 的键下

def create(conn, %{"post" => post_params}) do

我不建议这样做,但您可以将控制器更改为:

def create(conn, %{} = post_params) do

查找没有根post 键的参数。但是拥有post 键意味着您可以轻松地拥有与表单无关的其他参数。

我也不建议禁用 CSRF 检查。您可以通过将 CSRF 令牌存储在元标记中来轻松提交:

<meta name="csrf" content="<%= Plug.CSRFProtection.get_csrf_token() %>">

然后将其作为标题添加到您的发布请求中:

var csrf = document.querySelector("meta[name=csrf]").content;

$.ajax({
    url: "/posts",
    type: "post",
    data: {
      post: { title: post } })
    },
    headers: {
        "X-CSRF-TOKEN": csrf 
    },
    dataType: "json",
    success: function (data) {
      console.log(data);
    }
});

【讨论】:

  • 它可以工作,但 csrf 令牌没有。如果我将其从管道中移除,它会起作用。
  • 我已经设法使用上述代码发出 PUT 请求(更新),但问题是当我尝试(在我的控制器的更新函数中)获取当前登录的用户(进行 jQuery AJAX 调用的用户)。我需要用户 ID 以限制用户仅更新与其 user_id 关联的实体的能力。
  • 你不应该把它传进去吗? @W.M.
猜你喜欢
  • 2017-02-18
  • 1970-01-01
  • 2018-12-23
  • 1970-01-01
  • 2016-10-14
  • 1970-01-01
  • 2010-12-06
  • 2019-08-26
  • 1970-01-01
相关资源
最近更新 更多