attr_accessor vs属性一个失败另一个

时间:2014-05-20 19:29:47

标签: ruby-on-rails ruby attributes attr-accessor

我在我的rails应用中使用她的 gem来从Web服务后端而不是数据库中获取数据。这个问题与宝石完全无关,尽管我相信这一点。

我的模特正在使用ActiveModel

class Merchant

  include ActiveModel::Model

  # Add the awesomeness of Her gem
  include Her::Model

  attr_accessor :name, :type

  validates :name, presence: true

end

我的控制器是

  def create

    @merchant = Merchant.new(params[:merchant])
    if @merchant.valid?
      respond_to do |format|
        if @merchant.save
          format.html { redirect_to @merchant, notice: 'Merchant was successfully created.' }
          format.json { render :show, status: :created, location: @merchant }
        else
          format.html { render :new }
          format.json { render json: @merchant.errors, status: :unprocessable_entity }
        end
      end
    else
     render :new
   end
  end

我的视图中有一个表格,如此

<%= form_for(@merchant) do |f| %>
  <%= f.label :name, "First Name" %>
  <%= f.text_field :name %>

  <%= f.label :type, "Type" %>
  <%= f.text_field :type %>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

现在,模型中需要attr_accessor :name, :type才能使表单正常运行或抛出此错误

undefined method `name' for #<Merchant(merchants) >

如果我在模型中添加attr_accessor,则@merchant.attributes将返回{}

这导致gem向服务器发送空白请求,因为gem使用attributes来构建请求。我检查了宝石的来源。

如果我不添加attr_accessor,那么除了表单引发错误外,一切正常。

修复此错误的方法是什么。说实话,我并不清楚attributes如何工作。

1 个答案:

答案 0 :(得分:0)

code表示如果@merchant有一个名为name的属性,则不会发生这种情况:

class Merchant

  include ActiveModel::Model

  # Add the awesomeness of Her gem
  include Her::Model

  attributes :name, :type

  validates :name, presence: true

end