2017-04-23 43 views
1

我嘗試創建一個帶有表單的項目頁面,以向其他用戶發送邀請。業主(已創建項目)可以邀請其他用戶參與項目。Ruby on rails-在項目頁面上創建邀請而不渲染新的動作

眼下,這裏是代碼:

的意見/項目/ 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> 

控制器/ 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表單來查找所有用戶,用他們的用戶名和電子郵件。 現在,當我提交這個表格時,我想創建一個邀請(一個通知,但我還沒有開始通知系統)。所以,我創造了這個模式

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 ),但是當我提交表單(該項目/顯示頁),我有這樣的錯誤:

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

這是正常的,但我想硝酸鉀w:

  1. 如何在不顯示視圖的情況下在數據庫中插入數據?
  2. 如何通過電子郵件地址訪問用戶ID? (在DB中)

謝謝!

注意:不要猶豫,問你是否需要更多的代碼來回答

+1

您希望將表單動作指向'create'路徑而不是'new'。按照Rails Restful約定,'new'動作將響應GET請求,而不是'POST'請求​​。要通過'POST'(表單提交)到達'create'方法,您應該將路徑更改爲'invites_path' –

+0

@AlexandreAngelim感謝您提供此信息!如果你看看invites_controller,我怎麼能存儲'@invite'?以及我怎樣才能訪問project_id和收件人的ID,取決於他的電子郵件? –

+1

在這種情況下,我會做的是將'invites'資源嵌套在路徑文件中的項目中,並將表單更改爲指向該嵌套路由。我不知道你爲什麼特別選擇使用'form_tag'而不是'form_for',並使用實際的邀請字段(如電子郵件)來創建新的邀請。您必須使用您當前的方法來更改幾件事情。表單動作應指向'project_invites_path(@project)',在'InvitesController#create'中,您將可以訪問'params [:project_id]'。我想你可以從那裏弄清楚。 –

回答

1

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

這是你的模式是用戶以及其中電子郵件是列,被命名爲「電子郵件」

+0

謝謝你的回答,我使用find_by而不是find_by_email,它工作的很棒! –