开发者

Rails 3 Nested Resources Edit/Update method - routing error

开发者 https://www.devze.com 2023-03-20 02:01 出处:网络
I need some help with nested resource actions. I have three nested resources: Jobs, Questions and Answers. I am currently only trying to get the edit/update method to work for the questions controller

I need some help with nested resource actions. I have three nested resources: Jobs, Questions and Answers. I am currently only trying to get the edit/update method to work for the questions controller. The relationship is as so: Jobs has_many questions and Questions belong to Jobs.

I am using the edit action on the questions and am getting an error:

No route matches "/jobs/1/questions"

and I cannot figure out why.

I currently have this code as my edit and update action in my Questions controller:

def edit
 @job = Job.find(params[:job_id])
 @question = @job.questions.find(params[:id])
end

def update
  @job = Job.find(params[:job_id])
  @question = @job.questions.find(params[:id])

  if @question.update_attributes(params[:question])
    redirect_to(@question)
  end
end

Models:

class Job < ActiveRecord::Base
has_many :questions

class Question < ActiveRecord::Base
belongs_to :job

Routes:

  resources :jobs do
   resources :questions do
    resources :answers
   end
 end

The things that I don't understand are: a) why is it redirecting me to the questions index path, when I didn't redirect it there, and b) It says that is not a valid route, but if I refresh that exact URL the page loads properly.

I have tried multiple options, but I can't figure out the solution.

Thanks for the help. Let me know if you need more info.

p.s. here is my rake route开发者_开发知识库s : https://gist.github.com/1077134


To get you started, In view/jobs/show.rb :

<%= link_to 'Edit', edit_jobs_path(@job) %>

In view/questions/show.rb :

<%= link_to 'Edit', edit_job_question_path(@question.job, @question) %>

In view/questions/edit.rb :

<%= link_to 'Show', job_question_path %>

What I'm showing is that the links need to have a nested pattern. If your answers had many comments, you might end up with things like: edit_job_question_answer_comment(@job, @question, @answer, @comment) where the @symboled variables are derived in the controller. Hope this helps!

You may later want:

class Job < ActiveRecord::Base
  has_many :questions
  has_many :answer, :through => :questions

  # If you want to edit the questions of a job whilst editing a job then research accepts nested attributes
  #accepts_nested_attributes_for :questions, :allow_destroy => true
end


So it turns out that my issue was a little more involved than I had originally thought. My database and tables were not setup properly and they were having trouble finding the proper :ids for my resources. I had to start by normalizing my tables like so:

class CreateQuestions < ActiveRecord::Migration
def self.up
create_table :questions do |t|
   t.references :job
  t.text :question1
  t.text :question2
  t.text :question3
  t.text :question4
  t.text :question5
  t.text :question6
  t.text :question7
  t.text :question8
  t.text :question9
  t.text :question10

  t.timestamps
end
end

This set up was repetitive and dirty and it was messing up questions controller actions. So I changed it to:

def self.up
create_table :questions do |t|
  t.references :job
  t.text :question

  t.timestamps
end
end

and created nested_forms with loops in my jobs (the parent resource) new_form view.

<%= form_for(@job) do |f| %>
 <%= f.label :name %><br />
 <%= f.text_field :name %>
<%= f.fields_for :questions do |builder| %>
 <%= f.label :question, "Question" %><br \>
 <%= f.text_area :question, :rows => 10 %>
<% end %>

After doing this all of my controller methods were cleaner and the edit/update action was working properly.

This is how I solved the issue, it may not be the best way to do so. Also, if you have anything to add or any questions about my code, just let me know and I'll see if I can help.

Thanks!

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号