Update your phoenix, phoenix_html deps, and if using ecto, update your phoenix_ecto dep
# mix.exs
def deps do
[{:phoenix, "~> 1.1"},
{:phoenix_ecto, "~> 2.0"},
{:phoenix_html, "~> 2.3"},
...]
endNow run $ mix deps.update phoenix phoenix_html phoenix_ecto
The @inner assign has been removed in favor of explicit rendering with render/3 and the new @view_module and view_template assigns.
In your web/templates/layout/app.html.eex (and other layouts), replace:
<%= @inner %>
with:
<%= render @view_module, @view_template, assigns %>
Ecto 1.1 has renamed Ecto.Model to Ecto.Schema and moved many Model functions to the Ecto module. Update your web/web.ex blocks:
def model do
quote
- use Ecto.Model
+ use Ecto.Schema
+ import Ecto
import Ecto.Changeset
...
end
end
def controller do
quote
...
alias MyApp.Repo
+ import Ecto
import Ecto.Query, only: [from: 1, from: 2]
...
end
end
def channel do
quote
...
alias MyApp.Repo
+ import Ecto
import Ecto.Query, only: [from: 1, from: 2]
...
end
endGettext has been added for internationalization and localization support. See the Gettext docs for full details.
To add Gettext support to your application first add :gettext to your deps in mix.exs:
def deps do
[...,
{:gettext, "~> 0.9"},
...]
endNext, in mix.exs, add the :gettext compiler to your project and :gettext to your :applications list in application list:
def project do
[...,
- compilers: [:phoenix] ++ Mix.compilers,
+ compilers: [:phoenix, :gettext] ++ Mix.compilers,
...]
end
def application do
[mod: {MyApp, []},
- applications: [:phoenix, :phoenix_html, :cowboy, :logger,
- :phoenix_ecto, :postgrex]]
+ applications: [:phoenix, :phoenix_html, :cowboy, :logger, :gettext
+ :phoenix_ecto, :postgrex]]
endNext, run $ mix deps.get
Now, create a gettext.ex file at web/gettext.ex with the following contents:
defmodule MyApp.Gettext do
@moduledoc """
A module providing Internationalization with a gettext-based API.
By using [Gettext](http://hexdocs.pm/gettext),
your module gains a set of macros for translations, for example:
import MyApp.Gettext
# Simple translation
gettext "Here is the string to translate"
# Plural translation
ngettext "Here is the string to translate",
"Here are the strings to translate",
3
# Domain-based translation
dgettext "errors", "Here is the error message to translate"
See the [Gettext Docs](http://hexdocs.pm/gettext) for detailed usage.
"""
use Gettext, otp_app: :my_app
endReplace MyApp with your app module and :my_app with your otp app.
Next run the following commands from your app root to add necessary gettext supporting files:
$ mkdir -p priv/gettext/en/LC_MESSAGES
$ curl https://raw.githubusercontent.com/phoenixframework/phoenix/277eb7dd03366b336458ffe8dbf637c133b595f0/installer/templates/new/priv/gettext/en/LC_MESSAGES/errors.po > priv/gettext/en/LC_MESSAGES/errors.po
$ curl https://raw.githubusercontent.com/phoenixframework/phoenix/277eb7dd03366b336458ffe8dbf637c133b595f0/installer/templates/new/priv/gettext/errors.pot > priv/gettext/errors.potNext, create a web/views/error_helpers.ex and add these contents:
defmodule MyApp.ErrorHelpers do
@moduledoc """
Conveniences for translating and building error messages.
"""
use Phoenix.HTML
@doc """
Generates tag for inlined form input errors.
"""
def error_tag(form, field) do
if error = form.errors[field] do
content_tag :span, translate_error(error), class: "help-block"
end
end
@doc """
Translates an error message using gettext.
"""
def translate_error({msg, opts}) do
# Because error messages were defined within Ecto, we must
# call the Gettext module passing our Gettext backend. We
# also use the "errors" domain as translations are placed
# in the errors.po file. On your own code and templates,
# this could be written simply as:
#
# dngettext "errors", "1 file", "%{count} files", count
#
Gettext.dngettext(MyApp.Gettext, "errors", msg, msg, opts[:count], opts)
end
def translate_error(msg) do
Gettext.dgettext(MyApp.Gettext, "errors", msg)
end
endAnd now you can import Gettext and MyApp.ErrorHelpers into your web.ex view block:
import MyApp.Router.Helpers
+ import MyApp.ErrorHelpers
+ import MyApp.GettextChangests are no longer encoded to errors when encoding to JSON. The changeset errors should be rendered explicitly. Update your web/views/changeset_view.ex (if it exists) with the following code:
defmodule MyApp.ChangesetView do
use MyApp.Web, :view
@doc """
Traverses and translates changeset errors.
See `Ecto.Changeset.traverse_errors/2` and
`MyApp.ErrorHelpers.translate_error/1` for more details.
"""
def translate_errors(changeset) do
Ecto.Changeset.traverse_errors(changeset, &translate_error/1)
end
def render("error.json", %{changeset: changeset}) do
# When encoded, the changeset returns its errors
# as a JSON object. So we just pass it forward.
%{errors: translate_errors(changeset)}
end
endIf you are not using Gettext with the ErrorHelpers module, add this function to your ChangesetView:
def translate_error({msg, opts}) do
String.replace(msg, "%{count}", to_string(opts[:count]))
end
def translate_error(msg), do: msgafter hooks have been replaced by a timeout option on push, and a receive("timeout", callback) hook.
// 1.0.x
channel.push("new_message", {body: "hi!"})
.receive("ok", resp => console.log(resp) )
.after(5000, () => console.log("times! up"))
channel.push("new_message", {body: "hi!"})
.receive("ok", resp => console.log(resp) )
.after(12000, () => console.log("times! up"))
// 1.1.0
// timeout default to 5000
channel.push("new_message", {body: "hi!"})
.receive("ok", resp => console.log(resp) )
.receive("timeout", () => console.log("times! up"))
// custom timeout as optional 3rd arg
channel.push("new_message", {body: "hi!"}, 12000)
.receive("ok", resp => console.log(resp) )
.receive("timeout", () => console.log("times! up"))
Related to the Ecto upgrades,
Ecto.Model.buildis nowEcto.build_assoc, so after making the above changes toweb/web.ex, any calls tobuildshould be replaced withbuild_assoc.