레일즈 앱에서 페이지, 블록, 블록 컨텐츠, 필드 및 필드 내용을 저장합니다.레일스에 동적 필드 저장하기
연관성은 다음과 같습니다
class Page < ActiveRecord::Base
has_many :blocks
has_many :block_contents, :through => :blocks
end
class Block < ActiveRecord::Base
belongs_to :page
has_many :block_contents
end
class BlockContent < ActiveRecord::Base
belongs_to :block
has_many :field_contents
end
class Field < ActiveRecord::Base
has_many :field_contents
end
class FieldContent < ActiveRecord::Base
belongs_to :block_content
belongs_to :field
validates :content, presence: true
end
이 사용 나는 페이지에 대한 동적 필드를 가질 수 있어요. 그러나 DB에 쓰기
현재과 같이 컨트롤러에서 이루어집니다 :이 일을 수행하는 동안def update
@page = Page.find(params[:id])
if params[:field_content].present?
params[:field_content].each do |block_content|
block_content.last.each do |field|
field_content_row = FieldContent.where(block_content_id: block_content.first, field_id: field.first).first
if field_content_row.present?
field_content_row.update(content: field.last)
else
field_content = FieldContent.new
field_content.block_content_id = block_content.first
field_content.field_id = field.first
field_content.content = field.last
field_content.save
end
end
end
end
if @page.update_attributes(page_params)
redirect_to pages_path
else
render 'edit'
end
end
, 그것은 아주 더러운 그리고 그것은 (뷰 내 FieldContent 내 검증을 표시하지 않습니다 유효성 검증은 유효하지 않은 경우 FieldContent를 저장하지 않으므로 작동하지만 전체 페이지가 저장되지 않도록하고 뷰에 표시해야합니다.
FieldContent의 유효성을 표시 할 수 있도록 어떻게 만들 수 있습니까?
<% @page.blocks.each do |block| %>
<% block.block_contents.each do |block_content| %>
<% field_group.fields.each do |field| %>
<input name="field_content[<%= block_content.id %>][<%= field.id %>]" id="field_content_<%= block_content.id %>_<%= field.id %>" type="text" value="<%= get_field_content(block_content, field.name) %>">
<% end %>
<% end %>
<% end %>
나는 내용 얻기 위해 사용하는 도우미 : 첫째로 당신이 위해 먼저해야 할 일
def get_field_content(block_content, field)
content = ''
block_content.field_contents.each do |field_content|
if field_content.field.name == field && field_content.block_content_id == block_content.id
content = field_content.content
end
end
content
end
5 년 전 비슷한 앱을 사용했는데 여전히 유용 할 수 있습니다. 다른 부분을 확인해도 되겠지만 컨트롤러를 통합 한 컨트롤러로 [관련 티끌은 여기에 있습니다] (https://github.com/coreyward/talent-releases/blob/master/app/concerns/response_form.rb) 여기를 클릭하십시오. ] (https : // github.co.kr/coreyward/talent-releases/blob/master/app/controllers/releases_controller.rb # L149-L153). – coreyward
@coreyward 흥미로워 보이지만 Ruby와 Rails에 새로운 점이 있습니다. 코드가하는 것에 대한 자세한 설명을 제공 할 수 있습니까? 두 모델에서 동시에 저장이 이루어 지도록 내 모델이 연관되어 있다고 생각합니까? – Cameron
@coreyward보기가 어떻게 보이는지 보여주기 위해 내 게시물을 업데이트했습니다. – Cameron