Я получаю ForbiddenAttributesError, когда отправляю обновление своему контроллеру Rails 4.

Модель называется «Компания», и у нее есть частный метод в контроллере:

 def company_params
  params.require(:company).permit( :adress_id,
                                  :name,
                                  :zusatz,
                                  :kontakt,
                                  :strasse,
                                  :adresszusatz,
                                  :plz,
                                  :ort,
                                  :telefon,
                                  :fax,
                                  :natel,
                                  :email,
                                  :alternative_email,
                                  :url,
                                  :anbieter_id,
                                  :eintrittsdatum,
                                  :betrag,
                                  :bemerkungen,
                                  :betrag_gwrj,
                                  :betrag_sgkv,
                                  :rechnungszusatz,
                                  :zusatzfeld_7,
                                  :zusatzfeld_8,
                                  :zusatzfeld_9,
                                  :zusatzfeld_10,
                                  :datum_mutation,
                                  :verzeichnis_id,
                                  :industry_ids => []#,
                                  #:latitude,
                                  #:longitude 
                                  )
end

BetterErrors показывает мне эти параметры запроса:

{"utf8"=>"✓", "_method"=>"patch", "authenticity_token"=>"0rDHB7BNuHikL3/Fktdaj6BFFDinpUwPdpy+12HdMw4=", "company"=>{"adress_id"=>"", "name"=>"AGIP Tankstelle Rapperswil", "zusatz"=>"", "kontakt"=>"Eni Suisse S.A.", "strasse"=>"Zürcherstrasse 92", "adresszusatz"=>"", "plz"=>"8640", "ort"=>"Rapperswil", "telefon"=>"", "fax"=>"", "natel"=>"", "email"=>"", "url"=>"", "anbieter_id"=>"", "eintrittsdatum"=>"", "betrag"=>"", "bemerkungen"=>"", "betrag_gwrj"=>"", "betrag_sgkv"=>"", "rechnungszusatz"=>"", "zusatzfeld_7"=>"test", "zusatzfeld_8"=>"", "zusatzfeld_9"=>"", "zusatzfeld_10"=>"", "datum_mutation"=>"", "verzeichnis_id"=>"HR & Stadt", "alternative_email"=>""}, "commit"=>"Speichern", "action"=>"update", "controller"=>"companies", "id"=>"375"}

Форма выглядит так:

...
<%= form_for @company, url: {action: "update"}, html: {class: "form-horizontal"} do |f| %>

    <div class="col-md-6">
      <div class="form-group">
        <%= f.label :adress_id %>
        <%= f.text_field :adress_id %>
      </div>
...
      <%= f.submit "Speichern" %>
    </div>

  <% end %>

И это метод обновления в контроллере:

def update 
@company = Company.find(params[:id])
if @company.update_attributes(params[:company])
  redirect_to(@company)
else
  render :edit
end
end

Если я использую хэш «company» в консоли rails и создаю компанию через Company.create [hash], он работает нормально. Есть идеи, почему Rails выдает мне эту ошибку?

0
tomburger 17 Дек 2013 в 19:55

1 ответ

Лучший ответ

Убедитесь, что в вашем контроллере вы используете company_params в update_attributes:

  def update
    @company = Company.find(params[:id])

    respond_to do |format|

      # Here use company_params and not params[:company]
      if @company.update_attributes(company_params)
        format.html { redirect_to @company, notice: 'company updated.' }
        format.json { head :no_content }
      else
        format.html { render action: "edit" }
        format.json { render json: @company.errors, status: :unprocessable_entity }
      end
    end
  end
1
Luke 18 Дек 2013 в 12:40
Спасибо, я только что добавил свой метод обновления. Единственное различие, которое я вижу, заключается в том, что вы используете company_params, а я использую params [: company].
 – 
tomburger
17 Дек 2013 в 20:01