2017-04-23 5 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 

그리고 컨트롤러 : -> Mongoid 당신이, 내가 내 DB (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 

그래서,이 모델을 만들었습니다), 양식을 제출하면 (프로젝트/쇼 페이지에서)이 오류가 있습니다.

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

정상이지만 알고 싶습니다. w :

  1. 보기를 렌더링하지 않고 데이터베이스에 데이터를 삽입하는 방법은 무엇입니까?
  2. 이메일 주소로 사용자 ID에 액세스하는 방법은 무엇입니까? (DB에 있음)

고마워요!

NB : render :nothing => true, :status => 200 그래서 당신의 생성 방법이 될 것입니다 당신이

+1

폼 액션이'new'가 아닌'create' 경로를 가리 키길 원합니다. Rails Restful convention에 따라'new' 액션은'POST' 요청이 아닌'GET' 요청에 응답 할 것입니다. 'POST' (폼 제출)로'create' 메소드를 사용하려면 경로를'invites_path'로 변경해야합니다. –

+0

@AlexandreAngelim이 정보를 제공해 주셔서 감사합니다!invites_controller를 보면'@invite'를 어떻게 저장할 수 있습니까? 이메일에 따라 project_id 및 수신자 ID에 어떻게 액세스 할 수 있습니까? –

+1

그런 경우에해야 할 일은 라우트 파일의 프로젝트 내에 리소스를'invites'하고 중첩시켜 폼을 중첩 된 라우트를 가리 키도록 변경하는 것입니다. 나는 왜 당신이 특히 form_for 대신에 form_tag를 사용하고 이메일과 같은 실제 초대장 필드를 사용하여 새로운 초대장을 만드는 것을 선택했는지 모른다. 현재 접근 방식을 사용하여 몇 가지를 변경해야합니다. form 액션은'project_invites_path (@project)'를 가리켜 야하고'InvitesController # create'에서는'params [: project_id]'에 접근 할 수 있습니다. 나는 네가 거기에서 알아낼 수 있다고 생각해. –

답변

1

1에 대답하기 위해 더 많은 코드를 필요로하는 경우 당신은 컨트롤러에이 라인과 아무것도 렌더링하지 않고 데이터베이스에 데이터를 삽입 할 수 있습니다) 물어 주저하지 말고 당신이 뭔가를 만들려고 할 때 잘못된 행동에 연결되어있어이

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"

+0

답변 해 주셔서 감사합니다. find_by_email 대신 find_by를 사용합니다. –