我是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.
任何帮助将不胜感激。感谢。
答案 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
根据您的需要,逻辑可能会有所不同,但您可以利用变更集为您填写表单。