Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.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
Ruby on rails Ruby on rails-找不到InvitesController#create的模板_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails Ruby on rails-找不到InvitesController#create的模板

Ruby on rails Ruby on rails-找不到InvitesController#create的模板,ruby-on-rails,ruby,Ruby On Rails,Ruby,我想用rails 5和mongoid创建一个邀请系统。但当我想发送电子邮件时,我有以下错误: Recipient can't be blank something goes wrong Recipient can't be blank No template found for InvitesController#create, rendering head :no_content Completed 204 No Content in 137ms 代码如下: invite.rb class

我想用rails 5和mongoid创建一个邀请系统。但当我想发送电子邮件时,我有以下错误:

Recipient can't be blank
something goes wrong
Recipient can't be blank
No template found for InvitesController#create, rendering head :no_content
Completed 204 No Content in 137ms
代码如下:

invite.rb

class Invite
  include Mongoid::Document
  include Mongoid::Timestamps

  field :email, type: String
  field :token, type: String

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

  before_create :generate_token

  def generate_token
    self.token = Digest::SHA1.hexdigest([self.project_id, Time.now, rand].join)
  end
end
class Project
  include Mongoid::Document
  include Mongoid::Timestamps

  # Principle informations concerning project
  field :title, type: String
  field :description, type: String
  field :client, type: String
  field :deadline, type: String
  field :creator_id, type: String

  belongs_to :owner, :class_name => 'User', inverse_of: :members
  has_many :members, :class_name => 'User', inverse_of: :owner
  has_many :invites
end
class User
  include Mongoid::Document
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise  :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  ## Database authenticatable
  field :email,              type: String, default: ""
  field :encrypted_password, type: String, default: ""

  ## Recoverable
  field :reset_password_token,   type: String
  field :reset_password_sent_at, type: Time

  ## Rememberable
  field :remember_created_at, type: Time

  ## Trackable
  field :sign_in_count,      type: Integer, default: 0
  field :current_sign_in_at, type: Time
  field :last_sign_in_at,    type: Time
  field :current_sign_in_ip, type: String
  field :last_sign_in_ip,    type: String

  has_many :projects, inverse_of: :projects
  has_many :invitations, :class_name => 'Invite', :foreign_key => 'recipient_id'
  has_many :sent_invites, :class_name => 'Invite', :foreign_key => 'sender_id'
end
class InvitesController < ApplicationController
    def new 
        @invite = Invite.new
    end

    def create 
        @invite = Invite.new(invite_params)
        @invite.sender_id = current_user.id
        if @invite.save
            InviteMailer.new_user_invite(@invite, new_user_registration_path(:invite_token => @invite.token)).deliver
            redirect_to user_path(current_user.id)
        else
            puts @invite.errors.full_messages
            puts "something goes wrong"
        end
        puts @invite.errors.full_messages
    end

    private
    def invite_params
        params.require(:invite).permit(:email, :token, :sender_id, :recipient_id, [:project_id])
    end 
end
project.rb

class Invite
  include Mongoid::Document
  include Mongoid::Timestamps

  field :email, type: String
  field :token, type: String

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

  before_create :generate_token

  def generate_token
    self.token = Digest::SHA1.hexdigest([self.project_id, Time.now, rand].join)
  end
end
class Project
  include Mongoid::Document
  include Mongoid::Timestamps

  # Principle informations concerning project
  field :title, type: String
  field :description, type: String
  field :client, type: String
  field :deadline, type: String
  field :creator_id, type: String

  belongs_to :owner, :class_name => 'User', inverse_of: :members
  has_many :members, :class_name => 'User', inverse_of: :owner
  has_many :invites
end
class User
  include Mongoid::Document
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise  :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  ## Database authenticatable
  field :email,              type: String, default: ""
  field :encrypted_password, type: String, default: ""

  ## Recoverable
  field :reset_password_token,   type: String
  field :reset_password_sent_at, type: Time

  ## Rememberable
  field :remember_created_at, type: Time

  ## Trackable
  field :sign_in_count,      type: Integer, default: 0
  field :current_sign_in_at, type: Time
  field :last_sign_in_at,    type: Time
  field :current_sign_in_ip, type: String
  field :last_sign_in_ip,    type: String

  has_many :projects, inverse_of: :projects
  has_many :invitations, :class_name => 'Invite', :foreign_key => 'recipient_id'
  has_many :sent_invites, :class_name => 'Invite', :foreign_key => 'sender_id'
end
class InvitesController < ApplicationController
    def new 
        @invite = Invite.new
    end

    def create 
        @invite = Invite.new(invite_params)
        @invite.sender_id = current_user.id
        if @invite.save
            InviteMailer.new_user_invite(@invite, new_user_registration_path(:invite_token => @invite.token)).deliver
            redirect_to user_path(current_user.id)
        else
            puts @invite.errors.full_messages
            puts "something goes wrong"
        end
        puts @invite.errors.full_messages
    end

    private
    def invite_params
        params.require(:invite).permit(:email, :token, :sender_id, :recipient_id, [:project_id])
    end 
end
user.rb

class Invite
  include Mongoid::Document
  include Mongoid::Timestamps

  field :email, type: String
  field :token, type: String

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

  before_create :generate_token

  def generate_token
    self.token = Digest::SHA1.hexdigest([self.project_id, Time.now, rand].join)
  end
end
class Project
  include Mongoid::Document
  include Mongoid::Timestamps

  # Principle informations concerning project
  field :title, type: String
  field :description, type: String
  field :client, type: String
  field :deadline, type: String
  field :creator_id, type: String

  belongs_to :owner, :class_name => 'User', inverse_of: :members
  has_many :members, :class_name => 'User', inverse_of: :owner
  has_many :invites
end
class User
  include Mongoid::Document
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise  :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  ## Database authenticatable
  field :email,              type: String, default: ""
  field :encrypted_password, type: String, default: ""

  ## Recoverable
  field :reset_password_token,   type: String
  field :reset_password_sent_at, type: Time

  ## Rememberable
  field :remember_created_at, type: Time

  ## Trackable
  field :sign_in_count,      type: Integer, default: 0
  field :current_sign_in_at, type: Time
  field :last_sign_in_at,    type: Time
  field :current_sign_in_ip, type: String
  field :last_sign_in_ip,    type: String

  has_many :projects, inverse_of: :projects
  has_many :invitations, :class_name => 'Invite', :foreign_key => 'recipient_id'
  has_many :sent_invites, :class_name => 'Invite', :foreign_key => 'sender_id'
end
class InvitesController < ApplicationController
    def new 
        @invite = Invite.new
    end

    def create 
        @invite = Invite.new(invite_params)
        @invite.sender_id = current_user.id
        if @invite.save
            InviteMailer.new_user_invite(@invite, new_user_registration_path(:invite_token => @invite.token)).deliver
            redirect_to user_path(current_user.id)
        else
            puts @invite.errors.full_messages
            puts "something goes wrong"
        end
        puts @invite.errors.full_messages
    end

    private
    def invite_params
        params.require(:invite).permit(:email, :token, :sender_id, :recipient_id, [:project_id])
    end 
end
在用户页面上发送邀请的表单:

<%= form_for @invite do |f| %>
            <%= f.text_field :project_id, :value => @project.id %>
            <%= f.label :email %>
            <%= f.email_field :email %>
            <%= f.submit 'Send' %>
        <% end %>

@project.id%>
邀请\u控制器.rb

class Invite
  include Mongoid::Document
  include Mongoid::Timestamps

  field :email, type: String
  field :token, type: String

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

  before_create :generate_token

  def generate_token
    self.token = Digest::SHA1.hexdigest([self.project_id, Time.now, rand].join)
  end
end
class Project
  include Mongoid::Document
  include Mongoid::Timestamps

  # Principle informations concerning project
  field :title, type: String
  field :description, type: String
  field :client, type: String
  field :deadline, type: String
  field :creator_id, type: String

  belongs_to :owner, :class_name => 'User', inverse_of: :members
  has_many :members, :class_name => 'User', inverse_of: :owner
  has_many :invites
end
class User
  include Mongoid::Document
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise  :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  ## Database authenticatable
  field :email,              type: String, default: ""
  field :encrypted_password, type: String, default: ""

  ## Recoverable
  field :reset_password_token,   type: String
  field :reset_password_sent_at, type: Time

  ## Rememberable
  field :remember_created_at, type: Time

  ## Trackable
  field :sign_in_count,      type: Integer, default: 0
  field :current_sign_in_at, type: Time
  field :last_sign_in_at,    type: Time
  field :current_sign_in_ip, type: String
  field :last_sign_in_ip,    type: String

  has_many :projects, inverse_of: :projects
  has_many :invitations, :class_name => 'Invite', :foreign_key => 'recipient_id'
  has_many :sent_invites, :class_name => 'Invite', :foreign_key => 'sender_id'
end
class InvitesController < ApplicationController
    def new 
        @invite = Invite.new
    end

    def create 
        @invite = Invite.new(invite_params)
        @invite.sender_id = current_user.id
        if @invite.save
            InviteMailer.new_user_invite(@invite, new_user_registration_path(:invite_token => @invite.token)).deliver
            redirect_to user_path(current_user.id)
        else
            puts @invite.errors.full_messages
            puts "something goes wrong"
        end
        puts @invite.errors.full_messages
    end

    private
    def invite_params
        params.require(:invite).permit(:email, :token, :sender_id, :recipient_id, [:project_id])
    end 
end
类邀请控制器@invite.token)).deliver
重定向到用户路径(当前用户id)
其他的
放置@invite.errors.full_消息
“出了点问题”
结束
放置@invite.errors.full_消息
结束
私有的
def invite_参数
参数require(:invite).permit(:email,:token,:发送者\u id,:接收者\u id,[:项目\u id])
结束
结束
我希望所有者能够邀请其他人,如果用户存在,它会将邮件发送给现有用户,但如果没有,它会发送一个链接来创建帐户并在项目中注册

我忘记了什么?为什么我会有这个错误


谢谢!

默认情况下,Rails中的控制器会自动使用与方法名称相对应的名称呈现视图。create方法中的
else
块没有响应,因此rails正在寻找名为
create
的视图进行渲染。将
render:new
放在该块中,这样将重新呈现
new
视图。

默认情况下,Rails中的控制器会自动使用与方法名称相对应的名称呈现视图。create方法中的
else
块没有响应,因此rails正在寻找名为
create
的视图进行渲染。在该块中放置
render:new
,以便重新呈现
new
视图。

在创建操作中,最后需要呈现一个页面,否则需要将用户重定向到另一个页面。例如,按如下方式更改代码:

def create 
        @invite = Invite.new(invite_params)
        @invite.sender_id = current_user.id
        if @invite.save
            InviteMailer.new_user_invite(@invite, new_user_registration_path(:invite_token => @invite.token)).deliver
            redirect_to user_path(current_user.id)
        else
            puts @invite.errors.full_messages
            puts "something goes wrong"
            redirect_to :back #OR render :new
        end

end
def create  
    @invite = Invite.new(invite_params)
    @invite.sender_id = current_user.id
    respond_to do |format|
      if @invite.save
        format.html { redirect_to '/', notice: 'Invite was successfully created' }
        format.json { render :@invite.json }
      else
        format.html { render :new }
        format.json { render json: @invite.errors, status: :unprocessable_entity }
      end
    end
end
def create 
  @invite = Invite.new(invite_params)
  @invite.sender_id = current_user.id
  if @invite.save
    InviteMailer.new_user_invite(@invite, new_user_registration_path(:invite_token => @invite.token)).deliver
    redirect_to user_path(current_user.id)
  else
    puts @invite.errors.full_messages
    puts "something goes wrong"
    render :new
  end
end
注意,如果保存对象失败(在'else'块的末尾),我将重新定向用户

如果您想要更好的代码,您应该有如下内容:

def create 
        @invite = Invite.new(invite_params)
        @invite.sender_id = current_user.id
        if @invite.save
            InviteMailer.new_user_invite(@invite, new_user_registration_path(:invite_token => @invite.token)).deliver
            redirect_to user_path(current_user.id)
        else
            puts @invite.errors.full_messages
            puts "something goes wrong"
            redirect_to :back #OR render :new
        end

end
def create  
    @invite = Invite.new(invite_params)
    @invite.sender_id = current_user.id
    respond_to do |format|
      if @invite.save
        format.html { redirect_to '/', notice: 'Invite was successfully created' }
        format.json { render :@invite.json }
      else
        format.html { render :new }
        format.json { render json: @invite.errors, status: :unprocessable_entity }
      end
    end
end
def create 
  @invite = Invite.new(invite_params)
  @invite.sender_id = current_user.id
  if @invite.save
    InviteMailer.new_user_invite(@invite, new_user_registration_path(:invite_token => @invite.token)).deliver
    redirect_to user_path(current_user.id)
  else
    puts @invite.errors.full_messages
    puts "something goes wrong"
    render :new
  end
end
上面的代码处理html和json请求


在创建操作中,最后需要呈现一个页面,否则需要将用户重定向到另一个页面。例如,按如下方式更改代码:

def create 
        @invite = Invite.new(invite_params)
        @invite.sender_id = current_user.id
        if @invite.save
            InviteMailer.new_user_invite(@invite, new_user_registration_path(:invite_token => @invite.token)).deliver
            redirect_to user_path(current_user.id)
        else
            puts @invite.errors.full_messages
            puts "something goes wrong"
            redirect_to :back #OR render :new
        end

end
def create  
    @invite = Invite.new(invite_params)
    @invite.sender_id = current_user.id
    respond_to do |format|
      if @invite.save
        format.html { redirect_to '/', notice: 'Invite was successfully created' }
        format.json { render :@invite.json }
      else
        format.html { render :new }
        format.json { render json: @invite.errors, status: :unprocessable_entity }
      end
    end
end
def create 
  @invite = Invite.new(invite_params)
  @invite.sender_id = current_user.id
  if @invite.save
    InviteMailer.new_user_invite(@invite, new_user_registration_path(:invite_token => @invite.token)).deliver
    redirect_to user_path(current_user.id)
  else
    puts @invite.errors.full_messages
    puts "something goes wrong"
    render :new
  end
end
注意,如果保存对象失败(在'else'块的末尾),我将重新定向用户

如果您想要更好的代码,您应该有如下内容:

def create 
        @invite = Invite.new(invite_params)
        @invite.sender_id = current_user.id
        if @invite.save
            InviteMailer.new_user_invite(@invite, new_user_registration_path(:invite_token => @invite.token)).deliver
            redirect_to user_path(current_user.id)
        else
            puts @invite.errors.full_messages
            puts "something goes wrong"
            redirect_to :back #OR render :new
        end

end
def create  
    @invite = Invite.new(invite_params)
    @invite.sender_id = current_user.id
    respond_to do |format|
      if @invite.save
        format.html { redirect_to '/', notice: 'Invite was successfully created' }
        format.json { render :@invite.json }
      else
        format.html { render :new }
        format.json { render json: @invite.errors, status: :unprocessable_entity }
      end
    end
end
def create 
  @invite = Invite.new(invite_params)
  @invite.sender_id = current_user.id
  if @invite.save
    InviteMailer.new_user_invite(@invite, new_user_registration_path(:invite_token => @invite.token)).deliver
    redirect_to user_path(current_user.id)
  else
    puts @invite.errors.full_messages
    puts "something goes wrong"
    render :new
  end
end
上面的代码处理html和json请求


更改您的创建方法,如下所示:

def create 
        @invite = Invite.new(invite_params)
        @invite.sender_id = current_user.id
        if @invite.save
            InviteMailer.new_user_invite(@invite, new_user_registration_path(:invite_token => @invite.token)).deliver
            redirect_to user_path(current_user.id)
        else
            puts @invite.errors.full_messages
            puts "something goes wrong"
            redirect_to :back #OR render :new
        end

end
def create  
    @invite = Invite.new(invite_params)
    @invite.sender_id = current_user.id
    respond_to do |format|
      if @invite.save
        format.html { redirect_to '/', notice: 'Invite was successfully created' }
        format.json { render :@invite.json }
      else
        format.html { render :new }
        format.json { render json: @invite.errors, status: :unprocessable_entity }
      end
    end
end
def create 
  @invite = Invite.new(invite_params)
  @invite.sender_id = current_user.id
  if @invite.save
    InviteMailer.new_user_invite(@invite, new_user_registration_path(:invite_token => @invite.token)).deliver
    redirect_to user_path(current_user.id)
  else
    puts @invite.errors.full_messages
    puts "something goes wrong"
    render :new
  end
end

更改您的创建方法,如下所示:

def create 
        @invite = Invite.new(invite_params)
        @invite.sender_id = current_user.id
        if @invite.save
            InviteMailer.new_user_invite(@invite, new_user_registration_path(:invite_token => @invite.token)).deliver
            redirect_to user_path(current_user.id)
        else
            puts @invite.errors.full_messages
            puts "something goes wrong"
            redirect_to :back #OR render :new
        end

end
def create  
    @invite = Invite.new(invite_params)
    @invite.sender_id = current_user.id
    respond_to do |format|
      if @invite.save
        format.html { redirect_to '/', notice: 'Invite was successfully created' }
        format.json { render :@invite.json }
      else
        format.html { render :new }
        format.json { render json: @invite.errors, status: :unprocessable_entity }
      end
    end
end
def create 
  @invite = Invite.new(invite_params)
  @invite.sender_id = current_user.id
  if @invite.save
    InviteMailer.new_user_invite(@invite, new_user_registration_path(:invite_token => @invite.token)).deliver
    redirect_to user_path(current_user.id)
  else
    puts @invite.errors.full_messages
    puts "something goes wrong"
    render :new
  end
end