2017-11-29 18 views
1

を見つけられませんでした。大丈夫です、私はRailsの初心者ですから、一般的なコーディングであまり経験はありませんので、これは愚かだと思われますが、ここに問題があります:Ruby on Rails 5.1.4がモデルID

私は、コードを編集し

は、ので、ここではより多くの情報を含め、私の現在のステータスの更新、次のとおりです。

投票&オプションモデル:

class Voting < ApplicationRecord 
    has_many :options 
    validates :vote, presence: true 
    accepts_nested_attributes_for :options 
end 

class Option < ApplicationRecord 
    belongs_to :voting 
end 

routes.rbを:

Rails.application.routes.draw do 
    resources :votings do 
    resources :options 
    end 
    root 'votings#new' 
end 

votings/new.html.erb:

<h1>create new poll</h1> 

<%= form_with scope: :voting, url: votings_path, local: true do |form| %> 
    <p> 
     <%= form.label :voting %><br> 
     <%= form.text_area :content %> 
    </p> 
    <p> 
     <%= form.fields_for :option do |option| %> 
      <%= option.label 'Optionen' %><br> 
      <%= option.text_field :vote %> 
     <% end %> 
    </p> 
    <p> 
     <%= form.submit %> 
    </p> 
<% end %> 

votings/show.html.erb:

<p> 
    <strong>Your Voting:</strong> 
    <%= @voting.content %> 
</p> 
<ul> 
    <p> 
    <%= @options.vote %> 
    </p> 
</ul> 

votings_controller.rb:

class VotingsController < ApplicationController 
     def show 
     @voting = Voting.find(params[:id]) 
     @options = @voting.options 
     end 

     def new 
     @voting = Voting.new 
     @voting.options.build 
    end 

    def create 
    @voting = Voting.new(voting_params) 
    @voting.save 
    redirect_to @voting 
    end 

    private 
    def voting_params 
    params.require(:voting).permit(:content, options_attributes: [:id, :vote]) 
    end 
end 

options_controller.rb :

class OptionsController < ApplicationController 
    def create 
    @voting = Voting.find(params[:id]) 
    @options = @voting.options.create(option_params) 
    redirect_to voting_path(@voting) 
    end 

    private 
    def option_params 
    params.require(:option).permit(:vote) 
    end 
end 

(オプションコントローラーのコードの一部がvotingsコントローラーと重複していると思うし、必要ならばそれもわからない)

同じページ内の関連オプションで投票を作成した後、同じページに投票オプションを表示する(voting/new.html.erb & voting/show.html.erb) 。

これは私の現在のエラーメッセージです:VotingsController#で

NoMethodErrorは#Votingため

未定義のメソッド `票」を作成します。0x0000000be55208

(これはコンテンツを提出した後に現れますフォームから) したがって、new.html.erbの形式はこれまでのところうまく動作します。

彼が、私はより詳細な情報が解決この問題を取得するのに役立ちます願っていshow.html.erb

から

<%= @options.vote %> 

に「投票」を行うには何を知っていないようです。

+3

"私はオプションが正しくありません"とはどういう意味ですか?どのようなエラー/予期しない動作がありますか?ログには何が表示されますか? –

+0

「id = 30」のオプションが見つからない showアクションが気に入らないようですが、これが問題の原因かどうかはわかりません – Fly

+1

どうしていますかoption_id 30?id 30のオプションである可能性があります。既に削除されています – rajbir

答えて

0

あなたの質問は細かいところではありませんので、明白な点を指摘しておきましょう。

あなたの投票コントローラーのshowアクションは、機知にアプリがオプションオブジェクトを見つけるため投票オブジェクトIDであることを期待するものを使用しています。

class VotingsController < ApplicationController 
    def show 
    @option = Option.find(params[:id]) # In a resource route this is a voting id! 
    @voting = @option.user # what is option.user? Should be option.voting? 
    end 

これは、ルートファイルがresources :votingsと定義されていることを前提としていますか?

+0

ありがとうございます。 大丈夫、その「ユーザー」のことはまったくあってはいけない、私は昨日疲れていたと思う...私は非常に多くのものを試してみた。残念なことだよ、ごめんなさい!それ以上の混乱を避けるために私はそれを編集しました。 そして、私のルートファイルは 'resourses:votings'を定義しています。 – Fly

0

あなたの疑問をデバッグするのに役立ちます。リンクリンクここで我々は、投票者のIDを送信しているshowアクションでこの

/voting/:id 

を作成することがredirect_to @votingとしてshowアクションにリダイレクトされて@votingを作成した後、このアクションで

def create 
    @voting = Voting.new(voting_params) 

    @voting.save 
    redirect_to @voting 
    end 

、その明確なストレートので、 showのアクションで私たちが取得しようとするとき params[:id]それはオプションのIDではない投票IDです 基本的にここにあるべきです

def show 
    @voting = Voting.find(params[:id]) 
    @options = @voting.options 
    end 

うまくいけば、あなたの疑問をデバッグするのに役立ちます。私はあなたが何を何にしているのか分からないので、それ以上のガイダンスを教えてください。ありがとうございました

0

私はあなたがオプションで投票モデルを表示しようとしていると仮定しています。

したがって、RESTful URLは/voting/<voting_id>です。オプションは、特定のオプションを表示するように、投票にネストされたリソースとしてroutes.rbをに含まれている場合、それは、localhost:3000/voting/1/options/20

1において、例えば/voting/<voting_id>/options/<option_id>

ある投票のIDであり、20はIDでありますオプション

ですからようにshowメソッドを変更する必要があります。私もVOを修正することをお勧めしたい

def show 
    @voting = Voting.find(params[:id]) 
    @options = @voting.options # Here it fetches all options for voting of the id passed 
end 

ting_params方法:

def vote_params 
    params.require(:voting).permit(:content, options_attributes: [:id, :vote]) 
end 

あなたは、単一の投票のために複数のオプションを持っているとして、あなたはそれを上書きします他のすべてのオプションのIDをホワイトリストに登録する必要があります。このhereについて詳しく読むことができます。

あなたが持っているモデルの関連付けは、rails guidesの例と非常によく似ています。それを読んで、コードを再利用して始めてください。

EDIT:

私は今のところ、代わりに動作するもののためにform_withの(レール5にソフト推奨されません)のform_forを使用することをお勧め。 IDの自動生成がform_withでサポートされていないため、私のために動作しなかっただけで、このようform_with使用

<h1>create new poll</h1> 

<%= <%= form_for @voting do |form| %> %> 
    <p> 
     <%= form.label :voting %><br> 
     <%= form.text_area :content %> 
    </p> 
    <p> 
     <%= form.fields_for :option do |option| %> 
      <%= option.label 'Optionen' %><br> 
      <%= option.text_field :vote %> 
     <% end %> 
    </p> 
    <p> 
     <%= form.submit %> 
    </p> 
<% end %> 

: あなたのvotings/new.html.erbは次のようになります。しかし、レールがリリースされるまでリファクタリングを続け、form_forをform_withに置き換えることができます。これは推測ですthis rails commit

+0

あなたの答えに感謝します。あなたは正しいです、私は同じnew.html.erbページのオプションで投票を作成し、同じshow.html.erbにオプションの投票を表示したいと思います。 あなたの答えは正しい方向ですが、それでも動作しません。 (私はまたあなたのリンクされたレールのガイドを再び通過した)。 質問を編集して現在のステータスに更新し、より詳細な情報を追加します。 – Fly

+0

form_withの代わりにform_forを使用すると、今のところ働くことができます。しかし、form_withはソフト非難されている、つまりform_forは将来のレールのバージョンではサポートされないことに注意してください。私は、元の答えを実際の解決策で編集しました。 – Kavitha

関連する問題