1

発行するProblemモデルがあります。has_many私の問題モデルのhas_many問題。問題と問題の両方issue_problemsを持つ独自のモデルを持つ、両方の結合テーブルがあります。belongs_to問題フォームで、select タグを使用して問題を問題に割り当てようとしています。(問題は既に作成されているため、問題に割り当てるだけです。) 試してみましたが、次のエラーが表示されます。

undefined method `reject' for "3":String

そしてスタックエラー:

app/controllers/problems_controller.rb:12:in `create'

注: 将来的には、複数の問題を割り当てて を利用できるようにすることを計画していますhas_manyが、今のところ、select で 1 つの問題を割り当てようとしています。

これが私のコードです:

私の問題モデル:

class Issue < ActiveRecord::Base
  validates :name, :presence => true, :on => :create

  has_many :issue_problems
  has_many :problems, :through => :issue_problems
end

私の問題モデル:

class Problem < ActiveRecord::Base
  validates :body, :presence => true
  belongs_to :user
  has_many :solutions
  has_many :issue_problems
  has_many :issues, :through => :issue_problems

  accepts_nested_attributes_for :solutions, :issues
end

私の問題問題モデル:

class IssueProblem < ActiveRecord::Base
  belongs_to :problem
  belongs_to :issue
end

problems_controller での私の作成アクション:

def create
  @problem = current_user.problems.new(params[:problem])
  @solution = @problem.solutions.new(params[:problem][:solution])
  respond_to do |format|
    if @problem.save
      @problem.issues << @problem.issue
      @solution.save!
      @solution.update_attributes(problem_id: @problem.id, user_id: current_user.id)
      format.html { redirect_to(@problem, :notice => 'Problem was successfully created.') }
      format.xml  { render :xml => @problem, :status => :created, :location => @problem }
    else
      format.html { render :action => "new" }
      format.xml  { render :xml => @problem.errors, :status => :unprocessable_entity }
    end
  end
end

私のフォーム:

<%= form_for(@problem) do |f| %>
  <%= f.hidden_field :published_at, :value => Time.now %>
  <% if @problem.errors.any? %>
  <div id="errorExplanation">
    <p>Halt! Just so you know, you have to fix these <%= pluralize(@problem.errors.count, "error") %> before you can ask a question:</p>
    <ul>
    <% @problem.errors.full_messages.each do |msg| %>
      <li>-&nbsp;<%= msg %></li>
    <% end %>
    </ul>
  </div>
  <% end %>
  <div class="input-container">
    <%= f.text_field :body, :placeholder => "What's your problem?" %>
  </div>
  <%= f.fields_for :solution do |f| %>  
    <%= f.hidden_field :published_at, :value => Time.now %>
  <div class="input-container">
    <%= f.text_field :body, :placeholder => "What solution do you propose?" %>
  </div>
  <% end %>
  <%= f.select :issue_ids, Issue.all.collect {|x| [x.name, x.id]}, :prompt => "Select an issue" %>
  <div id="button">
  <%= f.submit 'Add', :class => 'button' %>
  </div>
<% end %>
4

2 に答える 2

0

IssueProblem モデルは必要ないと思います。次のように、問題と問題のモデルに「has_and_belongs_to_many」を配置する必要があります。

class Issue < ActiveRecord::Base
  has_and_belongs_to_many :problems
end

class Problem < ActiveRecord::Base
  has_and_belongs_to_many :issues
end
于 2012-05-05T15:10:18.940 に答える
0

このリンクの 8. Associations - many -to-manyセクションを見るのに十分オープンであれば、すべてについて十分に理解できると思います。

この レールキャストを見て、すべてをゼロから理解してください。

編集:

問題は解決しましたが、これは、ROR の多対多の関連付けについて深い洞察を得るためにここを訪れた人々への指針としましょう。

于 2012-05-05T15:18:16.280 に答える