2017-04-26 14 views
0

私はテーブルがlandslidessourcesの2つあります(お互いに関係ないかもしれません)。私は、ユーザーが情報を記入してから両方のテーブルに提出できるようにするフォームが必要です。ここでsourcesフィールドのない私の現在のフォームの:データベース内の2つのテーブルに1つのフォームを提出する - ruby​​ on rails

= form_for :landslide, :url => {:controller => 'landslides', :action => 'create'} do |f| 

     .form-inputs 
     %form#landslideForm 
      .form-group.row 
      %label.col-sm-2.col-form-label{for: "textinput"}Date 
      .col-sm-10 
       = f.date_select :start_date, :class => "form-control" 
      #Some fields 
    .form-actions 
     = f.button :submit, class: "btn btn-lg btn-primary col-sm-offset-5", id: "submitButton" 

とパラメータ:

def landslide_params 
      params.require(:landslide).permit(:start_date, :continent, :country, :location, :landslide_type, :lat, :lng, :mapped, :trigger, :spatial_area, :fatalities, :injuries, :notes) 
    end 

    def source_params 
     params.require(:source).permit(:url, :text, :landslide_id) 
    end 

はまた、テーブルlandslidesから地すべりのIDを取るsources通話landslide_idの列があります。だから、ユーザーが新しい地すべりを提出すると、今後の地滑りID(自動インクリメントで、ユーザーは記入する必要はありません)をどのように取ることができますか?

ありがとうございます!あなたはそれに応じてaccept_nested_attributes_forと巣フォームを使用する必要が

答えて

1

HTMLは、ネストされた<form>要素を許可していないとすることができますと呼ばれるにありますまだ永続化されていないレコードのIDをフォームに渡す(IDを持たないため)。これは、あなたがLandslide.create(source_attributes: { foo: 'bar' })を行うことができますし、それがLandslideSourceレコードの両方を作成し、自動的にsources.landslide_idを介してそれらをリンクすることを意味します

class Landslide 
    # or has_many 
    has_one :source 
    accepts_nested_attributes_for :source  
end 

class Source 
    belongs_to :landslide 
end 

:あなたはaccepts_nested_attributes_forを使用するのと同じ要求にネストされたリソースを作成するには

。フォーム入力を作成するには

fields_forを使用します。

# use convention over configuration 
= form_for @landslide do |f| 
    .form-inputs 
    .form-group.row 
     # use the form builder to create labels instead 
     = f.label :start_date, class: 'col-sm-2 col-form-label' 
     .col-sm-10 
     = f.date_select :start_date, class: "form-control" 
    %fieldset 
     %legend Source 
     = f.fields_for :sources do |s| 
     .form-group.row 
      = s.label :url, class: 'col-sm-2 col-form-label' 
      .col-sm-10 
      = s.text_field :url, class: "form-control" 
     # ... 

class LandslidesController 

    # ... 

    def new 
    @landslide = Landslide.new 
    # this is needed to seed the form with inputs for source 
    @landslide.source.new 
    end 

    def create 
    @landslide = Landslide.new(landslide_params) 
    if @landslide.save 
     redirect_to @landslide 
    else 
     @landslide.source.new unless @landslide.source.any? 
     render :new 
    end 
    end 

    private 
    def landslide_params 
    params.require(:landslide).permit(
     :start_date, :continent, :country, 
     :location, :landslide_type, 
     :lat, :lng, :mapped, :trigger, :spatial_area, 
     :fatalities, :injuries, :notes, 
     source_attributes: [ :url, :text ] 
    ) 
    end 
end 
+0

ありがとうございました。この答えは本当に詳細です。しかし、私はまだ '' unpermitted parameter:sources'というエラーが出ています。 –

+0

デバッグのヘルプが必要な場合は、これを新しい点として出発点にしてください。 – max

+0

地滑りに多くの情報源がある場合は、すべての情報源を情報源に変更する必要があるかどうかは、情報源に関するものだと思いますか? –

0

:(。ここで入れ子にする必要がありますどのような形に関しては予約をすると、私は地すべり-フォーム経由で送信元の例を使用)

あなたのビューでlandslide.rb

accept_nested_attributes_for :sources 

<%= form_for :landslide do |f|%> 
    <%= f.select :start_date %> 

    <%= fields_for :sources do |s| %> 
     <%= s.input :your_column %> 
    <% end %> 

    <%= f.button :submit %> 
<% end %> 
(私はとにかくHAMLが、知りません)

ところで、質問の多くは、このすでに、それは 'ネストされたフォーム'

Nested forms in rails - accessing attribute in has_many relation

Rails -- fields_for not working?

fields_for in rails view

関連する問題