所以我试图构建一个带有一些错误处理的插件,如果用户没有通过身份验证来发送响应。这是我的代码:
defp respond(conn, :json, status, msg) do
try do
conn
|> put_resp_content_type("application/json")
#|> send_resp(status, Poison.encode!(%{errors: msg}))
|> put_status(status)
|> put_view(ChatApp.Web.UsersView)
|> render("error_user_creation.json", string: msg)
|> IO.inspect
|> halt
rescue ArgumentError ->
conn
|> put_resp_content_type("application/json")
|> send_resp(status, Poison.encode!(%{errors: [msg]}))
|> halt
end
end
所以它几乎正常工作,Inspect正在看
州::发送,状态:401
发送时,但从不发送我的错误消息。
我想第二个问题是,我真正想做的是将许多这些模板保存在error_view.ex文件中并使用Phoenix的渲染。
看到宏选择使用使用的命名约定,我有办法强制在另一个模块中渲染某个视图吗?
我对Elixir很新,所以感谢你的帮助!
编辑:
所以我找到 put_view 但是当我有200以外的任何错误代码时,这似乎不起作用。
如果我执行任何错误代码,它似乎不会发回消息,而只是专门为此插件发送消息。如果我在控制器的任何其他位置上执行 put_status ,它的工作方式完全正常但不在此处。
这是新代码:
case Accounts.check_token(List.first(token)) do
{:ok, user} ->
conn
|>GeneralUtils.put_private(:user, user)
|> AuthResponses.unauthorized
:error ->
conn
|> GeneralUtils.put_private(:error, {:error, "You do not have permissions"})
end
然而,只要状态为200,它就会发送我正在发送的正确的身体,如果它是其他任何东西它将会失败。
编辑,编辑:
我的代码运行完全合理,状态代码为200,但在放入其他内容时,它会中断:
它被称为这样:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.*;
public class DivisorException extends JFrame implements ActionListener{
//data fields
final int WIDTH = 300;
final int HEIGHT = 200;
public String divisors;
private int num;
private JButton find = new JButton("Find");
private JLabel question = new JLabel("Enter a number to find all of its divisors");
private JTextField answer = new JTextField(8);
private JLabel feedback = new JLabel("");
//constructor
public DivisorException(){
//call super class constructor --> "Name the Window"
super("Divisor");
//set characteristics
setSize(WIDTH,HEIGHT);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new FlowLayout());
//add components
add(question);
add(answer);
answer.addActionListener(this);
add(find);
find.addActionListener(this);
add(feedback);
}
@Override
public void actionPerformed(ActionEvent e){
try{
num = Integer.parseInt(answer.getText());
if(e.getSource().equals(find)){
feedback.setText("The divisors are: " + divisors);
}
}catch(NumberFormatException ex){
feedback.setText("Invalid input. Enter an integer!");
answer.setText("");
}
}
private String divisor(int num){
String divisors = "";
for(int i = 1; i <= num; i++){
if(num % i == 0){
divisors = (i + ", ");
}
}
return divisors;
}
}
我也知道这个AuthResponses.unauthorized应该是错误的,我现在正在测试,这更容易。
答案 0 :(得分:0)
我想第二个问题是,我真正想做的是将许多这些模板保存在error_view.ex文件中并使用Phoenix的渲染。
关注这一点,我可以直接回答你...... https://hexdocs.pm/phoenix/Phoenix.Controller.html#render/4
只需解决它,您将View模块作为第二个参数传递,与该View模块相关的模板以及您想要的分配。
关于用于身份验证的插件,除非您将其创建为学习elixir的方法,否则我建议您使用Guardian。这是一篇简单的文章,解释了如何使用api和凤凰html
的守护者