如何在html.exx文件上获取查询字符串值?

时间:2016-11-29 15:35:43

标签: elixir phoenix-framework

我是phoenix,elixir的新人。我试图在new.html.exx上的text_field上获取params [:task_id],类似于下面的rails代码。

<%= f.text_field :task_id, value: params[:task_id] %>

我在iex shell上找到了以下信息

[info] GET /tasks/1/comments/new
[debug] Processing by HelloWorld.CommentController.new/2
Parameters: %{"task_id" => "1"}

我尝试使用IEX.pry并得到以下结果,但我无法将其应用于text_input值。

pry(3)> conn.params["task_id"]
"1" 

还试过下面的代码,但没有运气。

<%= text_input f, :task_id, value: @conn.params["task_id"] %>
Got Error: assign @conn not available in eex template.

任何帮助将不胜感激。感谢。

2 个答案:

答案 0 :(得分:6)

您可以使用params中提供的@conn副本(可在使用Phoenix.Controller.render直接呈现的所有模板中使用)。

# new.html.eex
<%= @conn.params["task_id"] %>

如果要在主模板中使用@conn呈现的模板中使用Phoenix.View.render,则需要将其明确传递给新模板:

# new.html.eex
<%= render "form.html", ..., conn: @conn %>

您也可以传递params

# new.html.eex
<%= render "form.html", ..., params: @conn.params %>

并使用@params

# form.html.eex
<%= @params["task_id"] %>

答案 1 :(得分:2)

根据评论,您似乎正在使用Ecto和Changesets。

给出一些架构

schema "foo" do
  field :name, :string
  field :age, :integer
end

你可以在你的控制器中使用这样的东西

def new(conn, _params) do
  changeset = Foo.changeset(%Foo{})
  render conn, "new.html", changeset: changeset
end

这将允许您在html视图文件中包含类似的内容。

= form_for @changeset, foo_path(@conn, :create), [as: :foo], fn f ->
  = text_input f, :name
  = number_input f, :age
  = submit "Submit"
- end

然后返回控制器以获取create方法

def create(conn, %{"foo" => foo_params}) do
  foo = Foo.changeset(%Foo{}, foo_params)

  case Repo.insert(foo) do
    {:ok, foo} -> redirect conn, to: foo_path(:show, foo)
    {:error, changeset} -> render conn, "new.html", changeset: changeset
  end
end

根据您的需要,逻辑可能会有所不同,但您可以利用变更集为您填写表单。