Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir Phoenix 1.3添加自定义操作时出现的问题”;无功能子句&引用;_Elixir_Phoenix Framework - Fatal编程技术网

Elixir 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"

几天前,我开始使用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" => 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