0

Rails 3.2.17モデル内の2 つの仮想属性 ( expiration_amount& ) にアクセスしようとしexpiration_formatていますが、それらにアクセスすることはできませんでした。

他のすべては正しく更新されているようですが、私のログでは仮想属性が常に空白になっています。

編集提案どおりに両方を追加しましたが、まだ機能していませ:expiration_amount :expiration_formatん。attr_accessibleどちらも空白になります。私が気づいたことの 1 つは、DB にヒットした後にロガー呼び出しが発生していたことです。before_updateこれは正しいフィルターではありませんか?

EDIT 2Devise仮想属性へのアクセスを妨げている可能性はありますか?

EDIT 3モデル内のこれらの仮想属性にアクセスできなかった理由についてはまだ興味がありますが、コントローラーから開始することにしました (これは機能しています)。

ワーキングコントローラーアクション(Updateメソッド)

@user.set_expiration(params[:expiration_amount].to_i, params[:expiration_format])

ワーキングモデル法

def set_expiration(amount, format)
  if defined?(amount) && defined?(format)
    case format
    when "hours" 
      self.expiration = amount.hours.from_now
    when "days"
      self.expiration = amount.days.from_now
    when "weeks"
      self.expiration = amount.weeks.from_now
    else
      self.expiration = amount.hours.from_now
    end
  end
end

---オリジナルコード---

ユーザー.rb

class User < ActiveRecord::Base
  attr_accessible               :email, 
                                :password, 
                                :password_confirmation, 
                                :remember_me,
                                :first_name, 
                                :last_name, 
                                :company, 
                                :phone, 
                                :expiration,
                                :expiration_amount, 
                                :expiration_format

  attr_accessor                 :expiration_amount, 
                                :expiration_format

  before_update                 :set_expiration

  def set_expiration
    logger.debug "DEBUG - expiration_amount: #{expiration_amount}"
    logger.debug "DEBUG - expiration_format: #{expiration_format}"

    if expiration_amount && expiration_format
      case expiration_format
      when "hours" 
        self.expiration = expiration_amount.hours.from_now
      when "days"
        self.expiration = expiration_amount.days.from_now
      when "weeks"
        self.expiration = expiration_amount.weeks.from_now
      else
        self.expiration = expiration_amount.hours.from_now
      end
    end
  end
end

= form_for(resource, :as => resource_name, :url => admins_user_update_path(resource), :html => { :method => :put }) do |f| 
  = devise_error_messages! 

  %fieldset{id: "edit-user-account"}
    %legend
      Set User Access

    .field.required
      %label
        "Allow access for "
      = select_tag "expiration_amount", options_for_select(expiration_amount, 3)
      = select_tag "expiration_format", options_for_select(expiration_format, "days")
      %span.instructions
        From Now

    .field
      = f.submit "Grant Access"

ログ

  Parameters: {"utf8"=>"✓", "authenticity_token"=>"xxx=", "expiration_amount"=>"3", "expiration_format"=>"days", "commit"=>"Grant Access", "id"=>"5"}
User Load (0.6ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1  [["id", "5"]]
Admin Load (0.4ms)  SELECT "admins".* FROM "admins" WHERE "admins"."id" = 1 LIMIT 1
 (0.3ms)  BEGIN
DEBUG - expiration_amount: 
DEBUG - expiration_format: 
(0.3ms)  COMMIT
Redirected to http://localhost:8080/admins/users
4

3 に答える 3

0

私はついに問題が何であるかを理解しました!私は文字列を使用select_tagsしていたため、正しく名前が付けられていなかったので、次のようになりました。

= select_tag "expiration_amount", options_for_select(expiration_amount, 3)
= select_tag "expiration_format", options_for_select(expiration_format, "days")

次のようにレンダリングされました:

<select id="expiration_amount" name="expiration_amount">
<select id="expiration_format" name="expiration_format">

しかし、モデルがそれらを拾うために必要なものは次のとおりです。

= f.select :expiration_amount, options_for_select(expiration_amount, 3)
= f.select :expiration_format, options_for_select(expiration_format, "days")

<select id="user_expiration_amount" name="user[expiration_amount]">
<select id="user_expiration_format" name="user[expiration_format]">

その後、コントローラーではなく、モデルですべてを行うことができました。

モデル法

before_update :set_expiration

def set_expiration
  logger.debug "DEBUG @ User - expiration_amount: #{expiration_amount}"
  logger.debug "DEBUG @ User - expiration_format: #{expiration_format}"

  if defined?(expiration_amount) && defined?(expiration_format)
    amount = expiration_amount.to_i

    case expiration_format
    when "hours" 
      self.expiration = amount.hours.from_now
    when "days"
      self.expiration = amount.days.from_now
    when "weeks"
      self.expiration = amount.weeks.from_now
    else
      self.expiration = 0.hours.from_now
    end
  end
end
于 2014-03-24T00:26:41.117 に答える
0

Rails 3: attr_accessible にも入れます。

Rails 4: それらを許可していることを確認してください。

于 2014-03-23T22:10:08.720 に答える
0

Railsフォームヘルパーを使用してフォームを作成することをお勧めします:

.field.required
= form_for @user do |f|
  = f.label :expiration, "Allow access for "
  = f.select "expiration_amount", options_for_select(expiration_amount, 3)
  = f.select "expiration_format", options_for_select(expiration_format, "days")
  %span.instructions
   From Now

次に、コントローラーで:

@user = User.find(params[:id])
@user.update_attributes(params[:user])
于 2014-03-23T22:33:51.980 に答える