【问题标题】:Ruby on Rails object saves with blank valuesRuby on Rails 对象使用空白值保存
【发布时间】:2014-07-31 22:58:19
【问题描述】:

组控制器:

def show
    @cat = Category.find_by_id(params[:id])
    if @cat.group
        @group = @cat.group
        @members = @cat.group.group_members.all
        @mem = @group.group_members.build
    else
        @cat.build_group
        @cat.save
        @mem = @cat.group.group_members.build
    end
end

def add_member
    @cat = Category.find_by_id(params[:id])
    @group = @cat.group
    @group.group_members.build(member_params)
    if @group.save
        redirect_to group_path

end

查看:

- if @members.length > 0
    - @members.each do |member|
        %ul
            %li
                = member.first_name

= simple_form_for @mem, url: member_add_path(@cat.id), html: {:id => 'step_two_form'} do |f|

    = f.label "First name"
    = f.input :first_name, label: false
    = f.label "Last name"
    = f.input :last_name, label: false
    = f.label "Email"
    = f.input :email, label: false
    = f.label "Phone number"
    = f.input :telephone, label: false

    = f.button :button, "Add member"

当我提交此表单时,我可以看到创建了一个新对象,因为源中有一个新的<li>,但是无论输入如何,该对象都有空白值。

参数(在组控制器中):

def member_params
    params.require(:group_member).permit(group_members_attributes: [:first_name, :last_name, :email, :telephone, :relationship, :status])
end

在终端中,我可以看到我输入的值正在传递,但由于某种原因没有被保存。这是终端输出:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"7odxnZzHoyjgF/oougDIVKNR/9RkZOlK3IOpCaUVvpQ=", "group_member"=>{"first_name"=>"name", "last_name"=>"name", "email"=>"name@name.com", "telephone"=>"1234567890"}, "button"=>"", "id"=>"22"}

感谢所有帮助,谢谢。

编辑:

group_member.rb:

class GroupMember < ActiveRecord::Base
    belongs_to :group
    attr_accessor :first_name, :last_name, :email, :telephone, :relationship
end

【问题讨论】:

  • 你可以用associations 发布你的models 吗?

标签: ruby-on-rails ruby activerecord


【解决方案1】:

您的 member_params 方法不需要将 group_members_attributes 指定为嵌套哈希,您应该能够直接允许属性(它们将被允许在您放入 require(...) 部分的任何内容上):

def member_params
  params.require(:group_member).permit(:first_name, :last_name, :email, :telephone, :relationship, :status)
end

【讨论】:

  • 我的印象是这是必要的,因为这是在组控制器而不是 group_members 控制器中。无论哪种方式,都没有解决问题。
【解决方案2】:

扩展@DylanMarkow 的 答案,如果您尝试将first_name, last_name, email, telephone, relationship 字段保存在数据库 中,那么您需要从GroupMember 模型中删除以下行:

attr_accessor :first_name, :last_name, :email, :telephone, :relationship

由于attr_accessor,上述字段被视为虚拟属性,因此不会保存在数据库中。

更新

你能简单解释一下 attr_accessor 的用途是什么吗?我 认为它为列出的创建了一个 getter 和 setter 方法 属性?

是的,attr_accessor 是一个 Ruby 方法,它为属性创建 getter 和 setter 方法。当您在 Rails 模型 中使用 attr_accessor 时,列出的属性将被视为 虚拟属性,即,只有在模型实例之前,值才会在内存中/可访问因为它没有存储在数据库字段中(因为它被标记为虚拟属性)。在 Rails 模型中,您无需担心属性的 getter 和 setter,因为 ActiveRecord 会处理这些。

【讨论】:

  • 做到了!谢谢!我来自 Python/Django 背景,对 RoR 比较陌生。能简单解释一下attr_accessor的目的是什么吗?我认为它为列出的属性创建了一个 getter 和 setter 方法?
  • 谢谢@engineersmnky
  • @apardes 阅读我的回答中的更新部分供您参考。
【解决方案3】:

结合@DylanMarkows 的回答,您正在保存组,但不一定是成员

def add_member
  @cat = Category.find_by_id(params[:id])
  @group = @cat.group
  @group_member = @group.group_members.build(member_params)
  if @group_member.save
    redirect_to group_path
  else
    render ...
  end
end

这也可能有助于您的方法缺少end 并且可能在save 上缺少else

【讨论】:

    猜你喜欢
    • 2014-07-28
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 2013-09-01
    • 2019-04-03
    相关资源
    最近更新 更多