Ruby on rails Rails表单关联-从上一页传递id

Ruby on rails Rails表单关联-从上一页传递id,ruby-on-rails,forms,ruby-on-rails-4,associations,model-associations,Ruby On Rails,Forms,Ruby On Rails 4,Associations,Model Associations,试图弄清楚我们如何在形式上建立协会 我有3种型号: class Request < ActiveRecord::Base has many :answers has many :users, through: :answers end class Answer < ActiveRecord::Base belongs to :user belongs to :request end class User < ActiveRecord::Base h

试图弄清楚我们如何在形式上建立协会

我有3种型号:

class Request < ActiveRecord::Base
  has many :answers
  has many :users, through: :answers
end

class Answer < ActiveRecord::Base
   belongs to :user
   belongs to :request
end

class User < ActiveRecord::Base
   has many :answers
   has many :requests, through: :answers
end
类请求
我试图弄明白:如何让用户链接到
Request#Show
中的
Answer#new
,然后创建一个应答记录,将上一页中的
Request#Show
Request(id
)创建在用户的
应答
和他正在查看的
请求
之间的关联

我现在的方法是:我在
request#Show
上闪烁
request#id
值,然后当用户链接到
Answer#new
时,它将闪烁的值传递到Answer#new上的隐藏表单标记中。这似乎不是最好的方法


有什么想法吗?

使用flash的创造性方法令人赞叹,不过你的右手边有一个简单的方法。您可以在控制器之间传递参数,就像在使用路由名称的方法之间传递参数一样

我没有完全理解你在这个案例中想要达到的目的,但是看起来这篇博客应该让你开始


祝你好运

使用flash的创造性方法值得称赞,不过你的右手边有一个简单的方法。您可以在控制器之间传递参数,就像在使用路由名称的方法之间传递参数一样

我没有完全理解你在这个案例中想要达到的目的,但是看起来这篇博客应该让你开始

祝你好运

Request\Show

这可以通过或(或两者)之一实现。让我解释一下:


我肯定会在您的
请求中添加嵌套资源
路由:

#config/routes.rb
resources :requests do
   resources :answers, only: [:new, :create] #-> url.com/requests/:request_id/answers [POST]
end
这使您能够调用“嵌套”路由(即向子控制器发送数据并要求将“父”数据附加到请求的路由)

在您的情况下,您希望为请求创建一个答案。最有效的方法是使用如上所述的路由结构;这将允许您使用以下控制器方法:

#app/controllers/answers_controller.rb
class AnswersController < ApplicationController
   def new
      @request = Request.find params[:request_id]
      @answer = @request.answers.new
   end

   def create
      @request = Request.find params[:request_id]
      @answer = @request.answers.new answer_params
      @answer.save
   end

   private

   def answer_params
      params.require(:answer).permit(:title, :body)
   end
end
这将使您能够在此处访问此会话:

#app/controllers/answers_controller.rb
class AnswersController < ApplicationController
   def new
      user = User.find session[:user_id]
   end
end

#app/views/requests/show.html.erb
<%= link_to "New Answer", request_new_answer_path(request) %>
要将
@用户
分配给新的
应答
记录,只需在
应答#创建
中执行此操作:

#app/controllers/answers_controller.rb
class AnswersController < ApplicationController
   ...

   def create
      @request     = Request.find params[:request_id]
      @answer      = @request.answers.new answer_params
      @answer.user = current_user
      @answer.save
   end

end
#app/controllers/answers_controller.rb
类应答器控制器<应用程序控制器
...
def创建
@request=request.find参数[:request\u id]
@answer=@request.answers.new answer\u参数
@answer.user=当前用户
@回答。保存
结束
结束
Request\Show

这可以通过或(或两者)之一实现。让我解释一下:


我肯定会在您的
请求中添加嵌套资源
路由:

#config/routes.rb
resources :requests do
   resources :answers, only: [:new, :create] #-> url.com/requests/:request_id/answers [POST]
end
这使您能够调用“嵌套”路由(即向子控制器发送数据并要求将“父”数据附加到请求的路由)

在您的情况下,您希望为请求创建一个答案。最有效的方法是使用如上所述的路由结构;这将允许您使用以下控制器方法:

#app/controllers/answers_controller.rb
class AnswersController < ApplicationController
   def new
      @request = Request.find params[:request_id]
      @answer = @request.answers.new
   end

   def create
      @request = Request.find params[:request_id]
      @answer = @request.answers.new answer_params
      @answer.save
   end

   private

   def answer_params
      params.require(:answer).permit(:title, :body)
   end
end
这将使您能够在此处访问此会话:

#app/controllers/answers_controller.rb
class AnswersController < ApplicationController
   def new
      user = User.find session[:user_id]
   end
end

#app/views/requests/show.html.erb
<%= link_to "New Answer", request_new_answer_path(request) %>
要将
@用户
分配给新的
应答
记录,只需在
应答#创建
中执行此操作:

#app/controllers/answers_controller.rb
class AnswersController < ApplicationController
   ...

   def create
      @request     = Request.find params[:request_id]
      @answer      = @request.answers.new answer_params
      @answer.user = current_user
      @answer.save
   end

end
#app/controllers/answers_controller.rb
类应答器控制器<应用程序控制器
...
def创建
@request=request.find参数[:request\u id]
@answer=@request.answers.new answer\u参数
@answer.user=当前用户
@回答。保存
结束
结束

像这样的东西对我很有用:

  • 我有两个模型(公式和公式材料)
  • 公式有很多公式材料,属于公式
  • 我的公式控制器将@Formula设置为:

    @公式=公式。查找(参数[:id])

  • 通过在公式控制器中声明,我在公式show.html.erb中列出了公式材料,如下所示:

    @formula_materials=FormulaMaterial。其中(:formula_id=>@formula)

  • 当我想向公式中添加新的FormulaMaterial时,我的show.html.erb文件中的“new Formula Material”按钮如下所示:

    <%= link_to 'Add Material To Formula', new_formula_material_path(:formula_id => @formula), class: "btn btn-success" %>
    
    @formula),类:“btn btn成功”%>
    
  • 在“新路径”中,我将相关id设置为@formula变量。当我的FormulaMaterial传递到new.html.erb时,我的URL如下所示:

  • 在我的FormulaMaterial new.html.erb文件中,我创建了一个隐藏的_字段,通过使用“params”访问URL中的公式_id来设置关联值,如下所示:

    参数[:公式\u id]>
我不确定这是否是最好的方法,但这种方法允许我每次都将上一页的视图id作为表单中的隐藏、关联和设置字段传递


希望这有帮助

像这样的事情对我很有用:

  • 我有两个模型(公式和公式材料)
  • 公式有很多公式材料,属于公式
  • 我的公式控制器将@Formula设置为:

    @公式=公式。查找(参数[:id])

  • 通过在公式控制器中声明,我在公式show.html.erb中列出了公式材料,如下所示:

    @formula_materials=FormulaMaterial。其中(:formula_id=>@formula)

  • 当我想向公式中添加新的FormulaMaterial时,我的show.html.erb文件中的“new Formula Material”按钮如下所示:

    <%= link_to 'Add Material To Formula', new_formula_material_path(:formula_id => @formula), class: "btn btn-success" %>
    
    @formula),类:“btn btn成功”%>
    
  • 在"新"时代,_