Ruby rails - 在项目页面上创建邀请而不呈现新操作

Ruby on rails - create Invitation on Project page without render new action

我尝试创建一个带有表单的项目页面来向其他用户发送邀请。所有者(创建项目的人)可以邀请其他用户参与该项目。

现在,这是代码:

views/projects/show.html.erb

<div class="container">
    <h3> <%= @project.title %> </h3>
    <h6> Créé par <%= link_to @project.owner.username, user_path(@project.owner) %> </h6>
    <hr>
    <h3> Inviter des utilisateurs au projet </h3>

    <!-- form for search users -->
    <%= form_tag new_invite_path, method: :post, :class => 'form-inline' do %>
        <div class="form-group">
            <%= text_field_tag :search, params[:search], size: 30, class: 'form-control' %>
        </div>
        <%= submit_tag 'Ajouter au projet', class: 'btn btn-success' %>
    <% end %>
    <!-- end form for search users -->

    <!-- display users results -->
    <% @users.each do |user| %>
        <p> <%= user.username %> | <%= user.email %> </p>
    <% end %>
    <!-- end display results -->

</div>

controllers/projects_controller.rb

class ProjectsController < ApplicationController
    def show
        @project = Project.find(params[:id])
        @users = User.search(params[:search])
    end

    def new
        @project = Project.new
    end

    def create
        @project = Project.new(project_params)
        @project.owner = current_user
        @project.members = []
        if @project.save
            puts @project
            redirect_to user_path(current_user)
        else
            puts 'something went wrong'
            puts @project.errors.full_messages
            render 'new'
        end
    end

    private
    def project_params
        params.require(:project).permit(:title, :description, :client, :deadline, :owner, :members)
    end
end

在项目页面上,我有一个 Ajax 表格来查找所有用户,包括他们的用户名和电子邮件。 现在,当我提交此表单时,我想创建一个邀请(一个通知,但我还没有启动通知系统)。所以,我创建了这个 model :

class Invite
  include Mongoid::Document

  field :email

  belongs_to :project
  belongs_to :sender_id, :class_name => 'User'
  belongs_to :recipient_id, :class_name => 'User'
end

还有一个控制器

class InvitesController < ApplicationController

    def new 
        @invite = Invite.new(email: params[:search], sender_id: current_user.id)
        byebug
        @invite.save
    end

    def create
        @invite = Invite.new(params[:search])
        if @invite.save
            flash[:success] = 'the invitation is send'
            redirect_to user_path(current_user)
        else
            render 'projects/show'
        end
    end

end

如您所见,我想将邀请保存在我的数据库中(MongoDB -> Mongoid),但是当我提交表单时(在 project/show 页面上),我有此错误:

No route matches [POST] "/invites/new"

这很正常,但我想知道:

  1. 如何在不呈现视图的情况下将数据插入我的数据库?
  2. 如何使用电子邮件地址访问用户 ID? (在数据库中)

谢谢!

注意:如果您需要更多代码来回答,请随时询问

1) 您可以在数据库中插入数据,而无需在控制器上使用此行呈现任何内容 render :nothing => true, :status => 200 所以你的创建方法将是这样的

def create
    @invite = Invite.new(params[:search])
    if @invite.save
        flash[:success] = 'the invitation is send'
        render :nothing => true, :status => 200
    else
        render 'projects/show'
    end
end

这是错误的No route matches [POST] "/invites/new"当你尝试创建一些东西时,你需要去创建,而不是新的动作,只需更改表单上的url,因为你指向错误的操作。

2) 如果你有一个用户模型并且想通过电子邮件加载用户,你可以这样做

User.find_by_email("the email of the user")

这是您的模型是用户,电子邮件所在的列名为 "email"