2011-01-19 2 views
4

이있는 Model이 있습니다. form_for을 사용하여 새 항목을 만들고이를 데이터베이스에 저장하는 형식이 있습니다. 그러나 추측 할 수 있듯이 투표 필드를 0으로, 날짜 필드를 데이터베이스에 배치 할 때 현재 날짜와 같게하려고합니다. 이 값을 품목에 어떻게 설정하고 적용합니까?Ruby on Rails 양식의 모델 필드에 대한 기본값

양식의 숨겨진 필드를 사용할 수는 있지만 명확한 문제가 있습니다 (누군가 votes 필드를 거대한 숫자로 설정할 수 있음).

답변

10

는 그냥 기본값을 사용; 제로, db의 투표의 경우 date 대신 자동 시간 소인 (created_at)을 사용하고 설정할 매개 변수에 대해서만 양식의 필드가 있습니다. 민감한 속성을 보호하는 것을 잊지 마십시오.

class CreateModels < ActiveRecord::Migration 
    def up 
    create_table :models do |t| 
     t.string :username 
     t.text :data 
     t.string :tags 
     t.integer :votes, :default => 0 

     t.timestamps # this will give you two automatic fields: created_at and updated_at 
    end 
    end 
    … 
end 

class Model < ActiveRecord::Base 
    attr_protected :votes #so that it cannot be set by mass assignment 
    … 
end 
+0

+1 데이터 무결성 비즈니스 로직을 모델 대신 DB에 저장합니다. – Phrogz

+0

+1.[커뮤니티 중심의 Rails 스타일 가이드] (https://github.com/bbatsov/rails-style-guide#migrations)에서는 응용 프로그램 계층이 아닌 마이그레이션에서 기본값을 적용하는 것이 좋습니다. – Dennis

3

하나의 간단한 방법은 컨트롤러에서 만들기 작업의 기본값을 설정하는 것입니다.

@model = Model.new(params[:model]) 
@model.votes = 1 
@model.date = Time.now 
@model.save 

또 다른 방법은 모델에서 메소드를 만드는 것입니다.

class Model 

def new_default(model) 
    model = Model.new(model) 
    model.votes = 1 
    model.date = Time.now 
end 

그래서 당신은 컨트롤러에서, 당신은 것입니다 :

@model = Model.new_default(params[:model]) 

if @model.save 
    render something 
else 
    render something_else 
end 
1

가 여기에 보호 속성에 대한 스크린 캐스트입니다 : http://railscasts.com/episodes/26-hackers-love-mass-assignment

레일 모델은 기본, created_at에 의해 자동 타임 스탬프와 함께 와서 필드는 속성의 이름입니다 updated_at. 당신은 그들을 세우는 것에 대해 걱정할 필요가 없습니다, 그것은 당신을 위해 처리 할 레일입니다.

4

DB 제약 조건 접근 방식이 가장 좋음을 확인할 수 있습니다. 그러나 항상 사용할 수있는 것은 아닙니다. 하나의 테이블 상속이 있고 자식 모델마다 다른 기본값이 필요하다고 가정합니다. 이걸 모델에 넣는 것보다 좋습니다. 저를 예를 들어 보겠습니다 :

class ChildModel < Model 
    after_initialize :set_defaults 
    private 
    def set_defaults 
    self.allowed_votes_per_person = 10 if self.new_record? 
    end 
end 

사용하여 : new_default 방법 같은 등등 : after_initialize 콜백을 생성하고 전화를 기억 할 필요가 없습니다. 필수 기본값을 설정하지만, ChildModel.new를 호출 할 때 인터페이스 측면에서 눈에 띄지 않습니다.

0

아직 다른 사용자에게 답변 할 권한이 없지만 Nerian과 관련된 질문이 있으므로 게시하는 것이 좋습니다.

before_create : create_rest 
def create_rest 
    15.times do 
    self.players.build({:name => Rnlist.order("rand()").first.raname, 
         :cost => 140+rand(40), 
         :coop => rand(3)}) 
    end 
end 

과 같은 코드를 user.rb 모델에 사용하고 있습니다. 이 코드는 완벽하게 작동하며 이름이 다른 15 명의 플레이어를 만듭니다. 그러나 player.controller에서 create 메서드를 사용하여 플레이어 모델에 속성을 넣으려고하면 self.players.build 메서드는 아무런 오류없이 15 개의 빈 속성을 가진 플레이어. players_controller에서 create 대신 새로운 메서드를 사용하여 코드를 시도하면이 문제를 해결할 수 있다고 생각했지만 결과는 같습니다. self.players.build 메서드가 문제를 일으킬 수 있습니까? others.build() 및 Vinhboy.com blog에 대해 Ruby API을 확인했지만이 문제를 해결할 수 없습니다.