Elixir Phoenix 1.3添加自定义操作时出现的问题”;无功能子句&引用;
几天前,我开始使用Phoenix 1.3,一切都很好,直到我开始在控制器中添加新动作 路由器Elixir Phoenix 1.3添加自定义操作时出现的问题”;无功能子句&引用;,elixir,phoenix-framework,Elixir,Phoenix Framework,几天前,我开始使用Phoenix 1.3,一切都很好,直到我开始在控制器中添加新动作 路由器 resources "/users", UserController, only: [:show] do resources "/events", EventController do get "/:id", EventController, :join, as: :join end end 事件控制器.ex def join(conn, %{"event_id"
resources "/users", UserController, only: [:show] do
resources "/events", EventController do
get "/:id", EventController, :join, as: :join
end
end
事件控制器.ex
def join(conn, %{"event_id" => id}, current_user) do
#some stuff..
conn
|> put_status(:ok)
|> put_flash(:info, "You just joined Event")
|> redirect(to: page_path(conn, :index, current_user))
end
然后在我的展示模板中:/event/show.html.eex
<%= link "To list", to: user_event_path(@conn, :index, @event.user) %>
<%= if @current_user.id != @user.id do %>
<h1> <%= @user.name %> Event ! </h1>
<h3> <%= @event.title %></h3>
<p><%= @event.description %></p>
<p><%= @event.location %></p>
<p><%= @event.price %></p>
<%= link "Join", to: user_event_path(@conn, :join, @current_user.id,
@event.id), class: "btn btn-default btn-xs" %>
所以我明白,玩弄游戏是完全错误的! 由于Phoenix是修改我的conn的一个大插头,答案如下: router.ex:
post "/events/:id", EventController, :join
然后将其作为事件_controller.ex:
def join(conn, %{"id" => id}, current_user) do
conn
|> put_flash(:info, "You just joined Event")
|> redirect(to: page_path(conn, :index))
end
并将从模板中调用为/template/show.html.exx:
<%= link "Join", to: user_event_path(@conn, :join,
@current_user, @event),
method: :join,
class: "btn btn-danger btn-xs" %>
因此,我希望如果有人遇到同样的错误,并且无法了解发生了什么。您可以运行
mix phx.routes
查看哪些路由可用
如果您在提供的路由器上运行此操作,您将看到:
$ mix phx.routes
user_path GET /users/:id MyApp.Web.UserController :show
user_event_path GET /users/:user_id/events MyApp.Web.EventController :index
user_event_path GET /users/:user_id/events/:id/edit MyApp.Web.EventController :edit
user_event_path GET /users/:user_id/events/new MyApp.Web.EventController :new
user_event_path GET /users/:user_id/events/:id MyApp.Web.EventController :show
user_event_path POST /users/:user_id/events MyApp.Web.EventController :create
user_event_path PATCH /users/:user_id/events/:id MyApp.Web.EventController :update
PUT /users/:user_id/events/:id MyApp.Web.EventController :update
user_event_path DELETE /users/:user_id/events/:id MyApp.Web.EventController :delete
user_event_join_path GET /users/:user_id/events/:event_id/:id MyApp.Web.EventController :join
底部是连接路线:
user_event_join_path GET /users/:user_id/events/:event_id/:id MyApp.Web.EventController :join
有:用户id
,:事件id
和id
都存在
要使此功能正常工作,您实际需要的是:
<%= link "Join", to: user_event_path(@conn, :join, @current_user.id, @event.id), class: "btn btn-default btn-xs" %>
其结果如下:
user_event_path GET /users/:user_id/events/:id MyApp.Web.EventController :join
另外,如果您正在对数据进行任何更改(动词join表示更改),那么您可能应该使用PUT请求(基于此答案)
resources "/users", UserController, only: [:show] do
resources "/events", EventController
get "/events/:id", EventController, :join
end
user_event_path GET /users/:user_id/events/:id MyApp.Web.EventController :join