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
方法从控制器访问。
我有一个名为 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
方法从控制器访问。