Rails 4 - 设置关联外键值

Rails 4 - setting associated foreign key value

我有一个名为 project 的模型和另一个名为 invite 的模型。

协会是:

项目

has_many :invites

邀请

belongs_to :project

我想允许创建项目的用户向其他用户发送邀请,让他们加入该项目。

我有一个创建邀请的表格如下:

<%= simple_form_for(@invite, :url => invites_path) do |f| %>
            <%= f.hidden_field :recipient_id, :value => get_recipient_id %>
            <%#= f.hidden_field :project_id, :value => current_user.profile.project_id %>
            <%= f.hidden_field :project_id, :value => @invite.project_id %>
            <%= f.label :email %>
            <%= f.email_field :email %>
            <!-- This field should use :date_picker- but it isnt working -->
            <%= f.input :expiry, :as => :date, :label => "When do you need a response to this invitation?"  %>
            <%#= f.input :expiry, :as => :date_picker, :label => "When do you need a response to this invitation?"  %>


            <%= f.submit 'Send', :class=>"formsubmit" %>
            <% end %>

在上面的表格中,我试图设置 project_id 值。

在邀请控制器中,我有:

class InvitesController < ApplicationController
    before_action :get_project

    def index
        @invites = @project.invites
    end

    def new
      # @invite = Invite.new
      @invite = @project.invites.build
    end

    def create
      @invite = Invite.new(invite_params)
      @invite.sender_id = current_user.profile.id
      # @project = Project.find(params[:project_id])

      if @invite.save
           #send existing user email invitation to join project team
           InviteMailer.existing_user_invite(@invite).deliver_later 
           format.html { redirect_to @project }

           @invite.recipient.project.push(@invite.project)
        else
            @invite.recipient.project.push(@invite.project)
             InviteMailer.new_user_invite(@invite, new_user_registration_path(:invite_token => @invite.token)).deliver
        end

         # oh no, creating an new invitation failed

    end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_invite
      @invite = Invite.find(params[:id])
    end

    def get_project
      @project = Project.find(params[:project_id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def invite_params
      params[:invite].permit(:email, :project_id, :recipient_id)
    end   
end 

我认为 get_project 行动前会得到项目。相反,我收到一条错误消息:

undefined method `project_id' for #<Profile:0x007fa179509b60>
Did you mean?  project_ids
               project_ids=
               projects
               object_id

错误消息指向 project_id 表单中的隐藏字段。

谁能看出我错在哪里?

问题出在隐藏表单字段之一中的语句 current_user.profile.project_id

(错误消息指向这段代码,但我不知道你为什么在 post 中注释了那行)

错误清楚地表明 profile 没有 project_id 并且用户可以有多个项目。如果你想访问project_id,你可以这样做。

<%= f.hidden_field :project_id, value: @project.id %>

@project 可通过 get_project 方法从控制器访问。