Decent Exposure undefined方法`attributes ='为nil:NilClass

时间:2014-08-10 08:05:51

标签: ruby-on-rails

我开始在我的rails应用程序中使用decent_exposure,并且在尝试更新记录时遇到问题。我明白了:

NoMethodError in Frontend::UsersController#update
undefined method `attributes=' for nil:NilClass
Around line 22:
def update
  if user.save (line 22)
    redirect_to user_path(user.username)
  else
    render :edit

我的控制器:

class Frontend::UsersController < Frontend::FrontendController
  expose(:user, finder: :find_by_username, finder_parameter: :username, attributes: :user_params)

def create
  if user.save
    redirect_to user_path(user.username)
  else
    render :new
  end
end

def update
  if user.save
    redirect_to user_path(user.username)
  else
    render :edit
  end
end

private

  def user_params
    params.require(:user).permit(:firstname, :lastname, :email, :username, :birthday)
  end
end

我的FrontentController目前只有< ApplicationController

在app控制器中:

decent_configuration do
  strategy DecentExposure::StrongParametersStrategy
end

所以我已经完成了decent_exposure gem所需要的所有功能,在create方法中保存用户不会产生任何问题。如果我将save更改为update,我会再次收到同样的错误。知道为什么它没有从expose方法调用中获取我的user_params吗?

修改

我添加了我的视图部分:

= form_for user do |f|
  - if user.errors.any?
    %ul
      = list_of user.errors.full_messages do |error|
        = error.humanize
  %div
    %p= f.label :firstname
    %p= f.text_field :firstname
  %div
    %p= f.label :lastname
    %p= f.text_field :lastname
  %div
    %p= f.label :email
    %p= f.text_field :email
  %div
    %p= f.label :username
    %p= f.text_field :username
  %div
    %p= f.label :birthday
    %p= f.text_field :birthday
  %div= f.submit

进行了更多挖掘后,编辑操作似乎是update/:id而不是update/:username。我可以通过将URL作为user_path(user.username)传递,在编辑表单中解决这个问题(如果我将其从部分中删除)。这引出了另一个问题:如果我使用实例变量@user我可以form_for @user do |f|...,它会为我选择正确的路线,但我必须明确地传递user.username作为使用decent_exposure的user_path路由生成器的参数。为什么是这样?或者我错过了什么?

1 个答案:

答案 0 :(得分:0)

好的,事实证明使用decent_exposure不会改变对有问题的模型覆盖to_param的要求。快点:

def to_param
  username
end
在user.rb中

一切都很好。经验教训!