2017-04-23 14 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フォームがあります。 このフォームを送信すると、招待状(通知は作成しますが通知システムは開始していません)を作成します。 > Mongoid - あなたが見ることができるように、私は私のデシベル(MongoDBのに招待保存したい

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 

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 

そしてコントローラ:だから、私はこのモデルを作成しました)が、私は)プロジェクト/ショーページ(フォームを送信するとき、私はこのエラーがあります:

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

それは普通のことだが、私は自演したいですw:

  1. ビューをレンダリングせずにデータベースにデータを挿入する方法はありますか?
  2. 電子メールアドレスでユーザーIDにアクセスするにはどうすればよいですか? (DBにあります)

ありがとう!

NB:あなたは

+1

フォームアクションを 'new'ではなく' create'パスにしたいとします。 Railsの慣習に従って、 'new'アクションは' POST 'リクエストではなく 'GET'リクエストに応答します。 'POST'(フォーム提出)で' create'メソッドに到達するには、パスを 'invites_path'に変更してください。 –

+0

@AlexandreAngelimこの情報をありがとうございます!invites_controllerを見れば、どうすれば '@invite'を保存できますか?自分のメールに応じて、どのように私はproject_idと受信者のIDにアクセスできますか? –

+1

このような場合には、プロジェクト内のリソースを 'invites'ルートファイルに入れ子にし、フォームをそのネストされたルートを指すように変更します。私はあなたが特に 'form_for'の代わりに' form_tag'を使用し、実際の招待フィールド(電子メールのような)を使って新しい招待状を作成する理由を知りません。現在のアプローチを使用して、いくつかの変更が必要になります。フォームアクションは '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モデルを持っているし、電子メールでユーザーをロードする場合)、あなたはこの

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

ような何かを行うことができ、これはあなたのモデルであり、ユーザーであると電子メールは、ある列の名前は"email"

+0

答えをありがとう、私はfind_by_emailの代わりにfind_byを使用し、素晴らしい動作します! –

関連する問題