通过新表单传递ID

时间:2011-05-24 14:48:39

标签: ruby-on-rails ruby-on-rails-3 forms controller

这个问题是关于我正在尝试的另一种方法:

Passing IDs through a new Form

我有group#view page,可由Person访问。在此页面中,Person可以通过我开发的方法查看该组的成员。问题是我需要使用Honors中的ID,访问该页面的group中的ID以及来自person的ID来创建模型member这个group

在我的Honors控制器中,我有:

def create
  @person = Person.find(current_person)
  @asked_groupmembership = @person.owned_group_memberships.find_all_by_status(true,:include => [:group, :member])
  @asked_groupmembership.each do |agm|
  @honor = Honor.create(:group => Group.find(params[:group_id]), 
  :person => Person.find(current_person), :honored => Person.find(agm.member.id))
  end
 if @honor.save
 ...
end

在我看来,我有一个链接指示person到表单以创建新荣誉:

<% @asked_groupmembership.each do |agm| %>
  <%= link_to "Create Honor", new_honor_path(:group_id => @group.id, :person => current_person.id,
  :honored => agm.member.id) %> 

但在我的表格中,我无法得到ids和东西

<% form_for(:honor, :url => honors_path(:group_id, :person,
 :honored)) do |f| %>

我得到的错误是我找不到没有Id的组。

有什么想法吗?感谢。

## Edited2 ##

更改了我的crontroller

def new
  #@person = Person.find(params[:person])
  #@honored = Person.find(params[:honored])
  #@group = Group.find(params[:group_id])
  @honor = Honor.new
end


def create
  @person = Person.find(current_person)
  @honor = Honor.create(:group => Group.find(params[:group_id]),
           :person => Person.find(params[:person]),
           :honored => Person.find(params[:honored]))
 if @honor.save
 ...
end

2 个答案:

答案 0 :(得分:2)

首先,您似乎缺少控制器方法。除了创建新对象的每个表单外,通常还有两个控制器方法

  • 收集表单需要呈现的所有数据
  • 呈现表单

创建

  • 从表单
  • 收集数据
  • 创建新对象

在我看来,你错过了新方法。在新方法中,您将收集表单所需的所有隐藏数据(例如,用户不会直接输入的信息,例如@person信息)。然后,我会使用隐藏的表单参数将此信息放在您的表单中(而不是尝试将其放在表单URL中)。

答案 1 :(得分:0)

目标:从组#视图中,为组中的每个成员循环并创建和“添加荣誉”链接,同时跟踪特定成员被尊重的组,其中所述成员荣幸,尊敬的人。

以下内容实现了这一目标。

<强>路线:

match "honors/:group/:person/:honored" => "honors#create", :as=>"my_custom_new_honor"

群组视图:

<% @asked_groupmembership.each do |agm| %>
  <%= link_to "Create Honor", my_custom_new_honor_path(:group=> @group.id, :person => current_person.id,:honored => agm.member.id) %> 

荣誉控制器,创建方法

@honor = Honor.create(:group => Group.find(params[:group_id]),
                      :person => Person.find(params[:person]),
                      :honored => Person.find(params[:honored]))

在这种情况下,您不需要荣誉#new方法,您将直接进入create方法。这假设所有关系都已正确建立。