【问题标题】:Rails, Simple Form, Nested FormsRails、简单表单、嵌套表单
【发布时间】:2015-06-15 13:34:28
【问题描述】:
class Project
  has_many :project_questions, dependent: :destroy#, through: :projects
  accepts_nested_attributes_for :project_questions
end

我正在尝试使用 rails 4 和 Simple Form 制作应用程序。

我有称为项目、project_questions 和 project_answers 的模型。

它们之间的关联是:

项目:

has_many :project_questions, dependent: :destroy#, through: :projects
accepts_nested_attributes_for :project_questions

项目问题:

belongs_to :project#, counter_cache: true
has_many :project_answers, dependent: :destroy
belongs_to :user
accepts_nested_attributes_for :project_answers
belongs_to :user

项目答案:

belongs_to :project_question#, counter_cache: true
belongs_to :user

用户:

has_many :project_questions
has_many :project_answers

class ProjectQuestions
  belongs_to :project#, counter_cache: true
  has_many :project_answers, dependent: :destroy
  belongs_to :user
  accepts_nested_attributes_for :project_answers
end

项目答案:

belongs_to :project_question#, counter_cache: true
belongs_to :user 

我的目标是在我的项目展示页面上显示与项目相关的问题及其答案,并提供指向另一个表单的链接,您可以在其中提出问题或回答问题。我在挣扎。

在我的控制器中,我有:

项目:

def project_params
  params.require(:project).permit(project_question_attributes: [:title, :content, :user_id, :project_id,project_answer_attributes: [:answer, :project_question_id]],

Project_question:

def new
  @project_question = ProjectQuestion.new
  @project_id = params[:project_id]
  @project_question.project_answers[0] = ProjectAnswer.new
end

Project_answer:

def new
  @project_answer = ProjectAnswer.new
end

def project_question_params
    params[:project_question].permit(:id, :title, :content, :project_id,   :user_id,project_answer_atttibutes: [:id, :answer, :project_question_id, :user_id])
end

那么在我看来,我有:

项目#show:

<% if current_user.id ==  @project.creator_id %>
    <%= link_to 'Ask a question', new_project_project_question_path(:project_id => @project.id) %> 
  <% end %>

  <%= render 'project_questions/pqps' %>

Project_question#pqps(部分):

<div class="containerfluid">
  <div class="row">
    <div class="col-md-10 col-md-offset-1">
          <div class="categorytitle">
            <%= @project_question.try(:title) %>
          </div>
          <div class="generaltext">
            <%= @project_question.try(:content) %>
          </div>
          <span class="editproject">   
              <% if current_user.id == @project.creator_id %>
              <% end %>
          </span>
    </div>
  </div>
</div>

我的 project_questions 表单部分是:

<div class="containerfluid">
  <div class="row">
    <div class="col-md-10 col-md-offset-1">
          <% f.simple_fields_for :project_questions do |f| %>
              <%= f.input :project_id, as: :hidden, input_html: {value: @project_question_id} %>
              <%= f.input :title, label: 'Question:', :label_html => {:class => 'categorytitle'}, placeholder: 'Type your question here', :input_html => {:style => 'width: 100%', class: 'categorytitle'} %>
              <%= f.input :content, label: 'Is there any context or other information?', :label_html => {:class => 'categorytitle'}, placeholder: 'Context might help to answer your question', :input_html => {:style => 'width: 100%', rows: 5, class: 'generalprojecttext'} %>
              <%= f.button :submit %>   
           <% end %>
    </div>
  </div>
</div>

Project_answer#pa(部分):

(not yet written - still trying to get the questions to work)

我的路线是:

resources :projects do
    resources :project_questions do
      resources :project_answers
    end
end

当我尝试这个时,我的 project_questions 表单中出现错误:undefined local variable or methodf' for #`

我看不到它在表单块之外谈论 f 的位置。我尝试在 simple_fields 的表单中添加另一行,然后将项目问题表单嵌套在其中,但这并没有改变任何东西。

谁能看到我做错了什么?

谢谢

【问题讨论】:

  • 你应该有&lt;% f.simple_fields_for :project_questions do |f| %&gt;而不是这行&lt;%= simple_form_for :project_questions do |f| %&gt;
  • 谢谢 - 成功了。我不知道我是从哪里得到的。
  • 届时我会将其作为答案发布。

标签: ruby-on-rails simple-form


【解决方案1】:

您应该将此行 <% f.simple_fields_for :project_questions do |f| %> 更改为此 &lt;%= simple_form_for :project_questions do |f| %&gt; 以使其正常工作。

【讨论】:

    【解决方案2】:

    plataformatec simple_form wiki 有一个不错的 instructional page on using nested forms

    (顺便说一句,我发现不使用分部通常更容易诊断问题。一旦一切正常,您可以通过重构为分部来进行清理。)

    我相信你需要将一个局部变量传递给你的局部变量,所以它知道第一个“f”指的是什么。

    <%= render 'project_questions/pqps', locals: {f: f} %>
    

    (您也可以选择在 project_questions 的部分中使用不同的局部变量,以便您始终清楚错误消息中引用的内容。)

    【讨论】:

    • 谢谢。是的,我已经多次阅读 wiki。还是谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多