2013-01-13 2 views
2

참고 : 원래이 질문을했을 때 나는 생각지 않을 것입니다. 허용 된 대답은 내가 준 예제에 맞습니다. 즉, :value을 text_field로 전달할 수는 있지만 실제로는 date_select의 문제가 발생했습니다.이 문제에는 값 세트를 재정의 할 수있는 기능이 없습니다.양식 필드 값을 레일 양식으로 덮어 씌우십시오.

결과적으로 레일스에서이 파일이 업데이트되어 :selected => a_date을 설정하면 예상대로 작동합니다. 이것은 레일 4에 있습니다.


부모 모델로부터 그 값을 상속받을 수있는 모델이 있습니다. 그것은이 같은 작업 : 다음 사용자를 편집하는 양식을

class User < ActiveRecord::Base 
    attr_accessible :field_name 

    belongs_to :company 

    def field_name 
    if self['field_name'].nil? 
     company['field_name'] 
    else 
     self['field_name'] 
    end 
    end 

end 

class Company < ActiveRecord::Base 
    attr_accessible :field_name 
end 

을하지만, 사용자 값이 nil이 경우 물론, 그것은 내가 무엇을하지 않은, 회사의 값으로 양식을 채 웁니다 필요.

사용자 필드 값이 nil이면 값이 비어 있도록 양식 필드의 값을 무시하고 싶습니다.

<%= form_for @user do |f| %> 
    <%= f.text_field :field_name, @user['field_name'] %> 
<% end %> 

그러나 그것은 작동하지 않습니다, 재정의 값을 제공하는 메커니즘없는 것 : 1

시도가 이상적으로 내가 할 수있을 것입니다.

2 그래서 내가 두 번째 게터/세터를 만드는 방법에 대해 생각 시도 :

def field_name_uninherited 
    self['field_name'] 
end 

def field_name_uninherited=(value) 
    self['field_name']=value 
end 

지금은 <%= f.text_field :field_name_uninherited %>를 사용하고 예상대로 작동 - 위대한! field_name가 멀티 파라미터 속성을 사용하여 날짜 또는 다른 유형을 때,이 오류가 발생 : 그것은 추론으로

1 error(s) on assignment of multiparameter attributes 

I, 그것은이 날짜 필드 것을 알고하지 않기 때문에이 믿고 제외 데이터베이스에서이 필드 (_uninherited 접 L 어가있는)는 데이터베이스에 없습니다.

그래서 원래의 데이터베이스 필드와 동일한 유형으로 내 추가 방법을 표시하는 방법이 필요합니다. (FIELD_NAME 사용)


또 주, 상기 예는 간략화 된 버전이다. 나는 실제로 상속을 처리하기 위해 https://github.com/colinbm/inherits_values_from을 사용하고 있지만 이것이 중요한 것은 아니라고 생각합니다.


분명히 동일한 목표를 달성하는 더 좋은 방법이 있다면 나는 모두 귀입니다.

+0

나는 digitalWestie의 해결책이 여기에있는 길이라고 생각한다. 그러나 Attempt 2의 경우 나는 데이터베이스 백업이 아닌 '입력 된'속성을 갖게 해주는 오래된 보석을 썼다. 그리고 나는 누군가가 그것을 Rails 3 (https://github.com/daemon/virtual_attributes)에 이식했다는 사실을 알아 냈다.) 한 번 볼 가치가있을 수 있습니다. – latentflip

+0

n.b. 단지 2 살인 것을 발견 했으므로 실제로 사용하고 싶지는 않을 수도 있지만 어쨌든 관심이있을 수 있습니다. – latentflip

+0

아, 그래, 그런 식으로 그렇게하는 방법처럼 보이지만, 만약 내가 그것을 간단하게 유지할 수 있다면! 지금 당장 date_selects에서 그 작업을하는 것에 매달 렸습니다. (그래서 내가 가치라고 생각한 이유입니다 : – Colin

답변

10

그래서 사용자를 위해 가치를 표시하는 것과 관련하여 조금 다르게 행동하길 원하십니까?

폼 필드에 :value 옵션을 사용하면됩니다. 그런 식으로 정상적인 값을 설정하지만 양식 필드에 표시 할 값을 선택하십시오.

<%= f.text_field :company, :value => user.field_name_uninherited %> 
+0

아니면 그냥 : value => user [ 'field_name'] – latentflip

+0

@digitalWestie 아, 나는 그것을 완전히 생각해 보았다! 나는 이것을 전에 사용하려고 시도했으나 효과가 없었던 것으로 보인다. "2012-06-01", "to_date"및'{ 'field_name (1i)'=> 2012, 'field_name (2i)'=> 6, 'field_name (3i) '=> 15}'둘 다 작동하지 않는 것 같습니다. – Colin

1

내가 이해하는 한, 사용자가 필드 데이터를 입력하고 nil 인 경우에만 부모 (회사) 모델로 값을 채 웁니다. 그것은 before_save이 ActiveRecord 객체에서 save 메소드가 호출되기 바로 전에 (이름 에서처럼) 호출 되었기 때문에 완벽하게 작동합니다.새로운 요소를 생성하는 순간에 빈 그 양식 필드를 떠나,

class User < ActiveRecord::Base 
     attr_accessible :field_name 

     before_save :override_field 

     private 
     def override_field 
      if self.field_name.nil? 
      self.field_name = company.field_name 
      end 
     end 

이 방법은, 당신이 전무는 절약의 순간에 있다면 값을 오버라이드 (override)에만 수 있습니다 : 따라서 당신은 콜백의이 종류를 쓸 수 있습니다 . 희망이 작동합니다!

+0

) User 모델에서 값의 저장은 영향을받지 않아야합니다. 액세스 할 때 nil이면 대신 부모 (회사) 값을 반환해야합니다 (이 비트는 이미 작동 중입니다). 사용자가 자동으로 값을 Company 값으로 채우지 않아야합니다 .. – Colin

관련 문제