【问题标题】:Rails - Id can't be found in FormsRails - 在表单中找不到 ID
【发布时间】:2011-05-26 12:02:40
【问题描述】:

有一段时间我陷入了这个问题。我正在尝试通过一个表单传递 3 个 ID 以将数据保存在我的数据库中。

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.valid?
  flash[:success] = "Honor created."
  redirect_to (:back)
 else
  redirect_to (:back)
 end
end

在我看来,我调用了new 方法:

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

我的表格:

<% form_for @honor do |f| %>

 <%= f.hidden_field :group_id, :value => @group.id %>
 <%= f.hidden_field :person, :value => current_person.id %>
 <%= f.hidden_field :honored, :value => @honored.id %>

 <div class="field">
<%= f.label :texto %><br />
<%= f.text_field :texto %>
 </div>

当我单击提交按钮时,我收到此错误:

Couldn't find Group without an ID

app/controllers/honors_controller.rb:22:in `create'

{"utf8"=>"✓",
 "authenticity_token"=>"C7wofMY4VcyfdS10oc3iglex8nZVBMQ0Nh22nMiaOqs=",
 "honor"=>{"group_id"=>"39",
 "person"=>"2",
 "honored"=>"44",
 ...
                },
 "commit"=>"Insert"}

我该如何解决这个问题? 谢谢。

##EDITED##

class Honor < ActiveRecord::Base
  belongs_to :person, :class_name => 'Person', :foreign_key => "person_id"
  belongs_to :honored, :class_name => 'Person', :foreign_key => "honored_id"
  belongs_to :group, :class_name => 'Group', :foreign_key => "group_id"

【问题讨论】:

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


    【解决方案1】:

    您需要更新您的创建方法:

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

    因为提交表单后,您在 params[:honor] 中获得了数据。您可以在问题中发布的代码中看到传递给控制器​​的哈希:

    "honor"=>{"group"=>"39",
     "person"=>"2",
     "honored"=>"44",
    

    【讨论】:

    • 改了答案...请看一下。
    • 谢谢它的工作,都是我的名字错误,对不起!。但是我在表格中传递的东西是空白的,知道吗?
    • 我的意思是,当我检查我的数据库时,我保存了 ID 并创建了 honor,但表单中的所有内容都转到 nil
    • 如果你在控制台中执行下面的代码,你在db中得到了正确的记录吗? Honor.create(:group_id => 3, :person_id => 2, :honored_id => 1)
    • 是的。而且我还添加了我的属性,它保存得很好。
    【解决方案2】:

    为了或让它更易读,让我们这样做

    表格:

    <% form_for @honor do |f| %>
      <%= f.hidden_field :group_id, :value => @group.id %>
      <%= f.hidden_field :person_id, :value => current_person.id %>
      <%= f.hidden_field :honored_id, :value => @honored.id %>
      ...
    <% end %>
    

    控制器:

    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[:honor][:group_id]),
        :person => Person.find(params[:honor][:person_id]),
        :honored => Person.find(params[:honor][:honored_id])
      )
    
      if @honor.save
        ...
      end
    end
    

    表单中的每个隐藏字段都将作为params[:honor] 中的参数到达控制器

    现在,看看控制器,有些东西看起来不太对劲。 create 方法将创建一个新实例并在没有错误的情况下保存该对象。调用create 然后save 将起作用,但您可以调用new(而不是create)然后save 或继续使用create 然后valid?。我个人认为new 然后save 过程更干净。

    例子:

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

    【讨论】:

      猜你喜欢
      • 2015-11-03
      • 1970-01-01
      • 2017-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多