2011-02-18 3 views
2

레일스를 사용하여 (텍스트) 메시징 앱을 작성하고 있습니다. 여러 사람에게 메시지를 보낼 수 있도록 nested_forms를 사용하고 있습니다.중첩 된 양식 (레일스)을 사용하는 이상한 방법

컨트롤러에서 새 Message 객체를 인스턴스화 한 다음 각 멤버에 대해 Recipient 객체 (Message의 자식)를 작성합니다. 양식에서 각 수신자 옆에 확인란을 표시합니다. 새 Message 객체가 옆에있는 수취인 만 가질 수있게하려고합니다. 이것은 작동하지 않습니다.

양식이 렌더링 될 때까지는 모든 구성원에 대해받는 사람 개체가 인스턴스화됩니다. 즉, 기본적으로 메시지가 지정되지 않는 한 각 회원에게 메시지가 전송됩니다.

class Message < ActiveRecord::Base 
    has_many :recipients 
    accepts_nested_attributes_for :recipients  
    #columns: body:string, from:string, from_member_id:integer 
end 

class Member < ActiveRecord::Base 
    #columns phone:string, name:string 
end 

class Recipient < ActiveRecord::Base 
    belongs_to :message 
    belongs_to :member 
    #columns: member_id:integer, message_id:integer 
end 

messages_controller.rb :하지만 사용자가 자신이 여기에

로 전송 된 메시지입니다 내 모델을 원하는 사람을 지정할 수 있도록 양식을 사용하려는

def new 
    @message = Message.new 
    @members = Member.all 
    @members.each do |member| 
    @message.recipients << Recipient.new(:member_id => member.id) 
    end 
end 

def create 
    @message = Message.new(params[:message]) 
    redirect_to '/somewhere' 
end 
... 

을 그리고 여기 내있어 Message (APP /보기/메시지/새/html.erb)

<%= form_for(@message) do |f| %> 
    <% if @message.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@message.errors.count, "error") %> prohibited this message from being saved:</h2> 

     <ul> 
     <% @message.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <%= f.fields_for :recipients do |builder| %> 
     <div class="field"> 
      <input type="checkbox" value="<%= builder.object.member_id %>" name="recipients[id]" /> 
    /*WHAT GOES ^^^HERE^^^? */ 
      <%= builder.object.member.name %> 
     </div> 
    <% end %> 


    <div class="field"> 
    <%= f.label :body %><br /> 
    <%= f.text_field :body %> 
    </div> 

    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

번째의 라인 형태 댓글 전자 양식은 내가 문제가있는 곳입니다. 또한, 내가 MessagesController # create에서 일부 코드를 수정해야 할 수도 있지만, 어디서부터 시작해야할지 모르겠다.

답변

1

먼저 확인란을 HTML로 작성하는 대신 레일스 도우미를 사용해야합니다. 유효성 검사에 실패하면 양식을 다시 표시 할 때 많은 작업을 줄일 수 있습니다.

<%= builder.check_box :selected %> 

다음 단계는 다음과 같습니다

class Recipient 
    attr_accessor :selected 
end 

그런 다음 당신이 체크 박스에 그 속성을 연결할 수 있습니다 :

이 작업을 수행하려면받는 사람 클래스에 속성을 만들어야합니다 그 속성을 무언가하게 만드십시오. accepts_nested_attributes_for:reject_if 옵션을 사용해보세요. 당신은 :reject_if에 대한 자세한 내용은이 문서를 참조하십시오 그것을 확인란을 선택하지 않은 경우에 true를 반환하는 PROC, 예컨대 :

accepts_nested_attributes_for :recipients, :reject_if => proc { |attributes| attributes['selected'] != '1' } 

을 전달할 수 :

http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

+0

작품을 완벽하게, 감사합니다! – user94154

관련 문제