【问题标题】:Ruby on rails: Trouble creating an object with multiple associationsRuby on rails:无法创建具有多个关联的对象
【发布时间】:2013-05-07 20:49:49
【问题描述】:

我在创建具有关联的对象时遇到问题。

我有一个属于作业的消息模型,以及一个用户或跑步者。在我的 jobs/index.html 中,我想显示一个包含相应消息的工作列表以及一个为该特定工作创建新消息的表单。

问题是每当我创建消息时,job_id 都保持为零。我是 ruby​​ on rails 的新手,所以我仍然不完全理解这些东西。

这是我的作业/index.html 的一部分(注意:不是我的实际代码,我正在上课,所以我只是输入了这个,可能包含语法错误)。

    <% @jobs.each do |job| %>

      <p> <%= job.body %> </p>

      <%= form_for job.messages do |f| %>
        <%= f.label :body %>
        <%= f.text_field :body %>
        <%= f.submit %>
      <% end %>

      <%if job.messages.present? %>
      <ul>
        <% job.messages.each do |message| %>
            <li>
                <p> message.description <p>
            </li>
        <% end %>
      </ul>
      <% else %>
        <p> No messages <p>
      <% end %>

    <% end %>

这是消息控制器中的创建方法(注意:current_login 可以是跑步者或用户,他们都共享相同的属性)

def create
    @message = current_login.messages.new(params[:message])
    @message.save
end

作业控制器索引操作

def index
    @jobs = Job.all
end

消息模型

class Message < ActiveRecord::Base
  attr_accessible :description
  belongs_to :user
  belongs_to :runner
  belongs_to :job
end

用户模型

class User < ActiveRecord::Base
  attr_accessible :username
  has_many :jobs
end

跑步者模型

class Runner < ActiveRecord::Base
  attr_accessible :username
  has_many :jobs
end

工作模式

class Job < ActiveRecord::Base
  attr_accessible :body
  has_many :messages
  belongs_to :user
  belongs_to :runner
end

每当我在 jobs/index.html 视图中提交消息表单时,它似乎成功地创建了一条成功填写了 user_id 或 runner_id 的消息(取决于发布消息的人),但我的 job_id 属性为零.

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 associations


    【解决方案1】:

    由于您的消息属于工作,我认为您应该在工作表单中创建嵌套资源。

    您在作业模型中的new 控制器函数应该像这样构建关联:

    def new
        @job = Job.new(params[:job])
        @message = @job.build_message
    end
    

    您的创建模型只需要保存父模型:

    def create
        @job = Job.create(params[:job])
    end
    

    有关如何执行此操作的详细信息,请观看此 railscast:http://railscasts.com/episodes/196-nested-model-form-part-1

    我还应该补充一点,如果您只是想向现有工作添加消息,只需在表单中正确传递 job_id 的参数,并确保您引用的工作确实存在。

    【讨论】:

    • 我不知道我是否可以这样做,new 用于创建新工作而不是消息。
    • 当然可以。观看我刚刚添加到我的回复中的视频
    • 谢谢,那个视频很有帮助,但没有解决我的问题。
    【解决方案2】:

    为了解决这个问题,我决定通过表单中的隐藏字段手动创建消息与其所属工作之间的联系。

                      <%= form_for(@message) do |f| %>
                        <%= f.label :body, "Description" %>
                        <%= f.text_area :body %>
                        <%= f.hidden_field :job_id, value: job.id %>
                        <%= f.submit 'Create message', class: 'button small secondary' %>
                      <% end %>
    

    【讨论】:

      猜你喜欢
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-06
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 1970-01-01
      相关资源
      最近更新 更多