Rails 表单关联 - 从上一页传递 id
Rails Form Associations - Passing id From Previous Page
想办法在表单中建立关联。
我有 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
我想弄清楚:如何让用户 link 从 Request#Show
到 Answer#new
,然后创建一条传入 Request#Show
[的答复记录=15=] 来自上一页 - 在用户的 Answer
和他正在查看的 Request
之间创建关联。
我现在这样做的方法是:我在 Request#Show
上闪现 request_id
值,然后当用户 links 到 Answer#new
时,它通过在 Answer#new 上将值闪现到隐藏的表单标签中。这似乎不是执行此操作的最佳方法。
有什么想法吗?
感谢使用 Flash 的创造性方法,但是您的权利有一个简单的方法。您可以在控制器之间传递参数,就像使用路由名称在方法之间传递参数一样。
我不太理解你在这种情况下试图实现的目标,但看起来这篇博客文章应该可以帮助你开始......
https://agilewarrior.wordpress.com/2013/08/31/how-to-pass-parameters-as-part-of-the-url-in-rails/
祝你好运!
User link to Answer#new
from Request#Show
这可以通过 sessions
or nested resources
(或两者!)来实现。让我解释一下:
我肯定会向您的 requests
路线添加 嵌套资源 :
#config/routes.rb
resources :requests do
resources :answers, only: [:new, :create] #-> url.com/requests/:request_id/answers [POST]
end
这使您能够调用 "nested" 路由(IE 将数据发送到子控制器,并要求将 "parent" 数据附加到请求中)。
在您的情况下,您想要为 请求 创建一个 answer。最有效的方法是使用上面的路由结构;这将允许您使用以下控制器方法:
#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
以上内容使您能够通过将 request_id
传递给嵌套路由来 创建 答案。您必须注意相应的路线将需要 POST 方法才能工作。
您不需要 new
方法。如果你想要,用上面的结构就可以轻松搞定。
传递用户有点棘手。
您可以使用路由,或设置会话。
我会亲自设置一个会话(它更干净):
#app/controllers/requests_controller.rb
class RequestsController < ApplicationController
def show
session[:user_id] = @user.id #-> I don't know how you populate @user
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) %>
--
如果您使用 Devise,用户对象应该在 current_user
object 中可用(这意味着您不必设置 session[:user_id]
):
#app/controllers/answers_controller.rb
class AnswersController < ApplicationController
def new
## current_user available here if using devise
end
end
要将 @user
分配给新的 answer
记录,只需在 answers#create
:
中执行此操作
#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
像这样的东西对我有用:
- 我有两个模型(Formula 和 FormulaMaterial)
- Formula has_many FormulaMaterials,属于Formula
我的公式控制器像这样设置@formula:
@formula = Formula.find(参数[:id])
我在我的公式 show.html.erb 中列出我的公式材料,方法是在我的公式控制器中声明它,如下所示:
@formula_materials = FormulaMaterial.where(: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" %>
在 "new_..._path" 中,我将关联的 id 设置为 @formula 变量。当它传递到我的 FormulaMaterial 的 new.html.erb 时,我的 URL 看起来像这样:
在我的 FormulaMaterial new.html.erb 文件中,我创建了一个 hidden_field,它通过使用 "params" 访问 formula_id 来设置关联值在 URL 中像这样:
参数[:formula_id] %>
我不确定这是否是最好的方法,但这种方法让我每次都能将前一页的视图 ID 作为表单中的隐藏、关联和设置字段传递。
希望对您有所帮助!
想办法在表单中建立关联。
我有 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
我想弄清楚:如何让用户 link 从 Request#Show
到 Answer#new
,然后创建一条传入 Request#Show
[的答复记录=15=] 来自上一页 - 在用户的 Answer
和他正在查看的 Request
之间创建关联。
我现在这样做的方法是:我在 Request#Show
上闪现 request_id
值,然后当用户 links 到 Answer#new
时,它通过在 Answer#new 上将值闪现到隐藏的表单标签中。这似乎不是执行此操作的最佳方法。
有什么想法吗?
感谢使用 Flash 的创造性方法,但是您的权利有一个简单的方法。您可以在控制器之间传递参数,就像使用路由名称在方法之间传递参数一样。
我不太理解你在这种情况下试图实现的目标,但看起来这篇博客文章应该可以帮助你开始......
https://agilewarrior.wordpress.com/2013/08/31/how-to-pass-parameters-as-part-of-the-url-in-rails/
祝你好运!
User link to
Answer#new
fromRequest#Show
这可以通过 sessions
or nested resources
(或两者!)来实现。让我解释一下:
我肯定会向您的 requests
路线添加 嵌套资源 :
#config/routes.rb
resources :requests do
resources :answers, only: [:new, :create] #-> url.com/requests/:request_id/answers [POST]
end
这使您能够调用 "nested" 路由(IE 将数据发送到子控制器,并要求将 "parent" 数据附加到请求中)。
在您的情况下,您想要为 请求 创建一个 answer。最有效的方法是使用上面的路由结构;这将允许您使用以下控制器方法:
#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
以上内容使您能够通过将 request_id
传递给嵌套路由来 创建 答案。您必须注意相应的路线将需要 POST 方法才能工作。
您不需要 new
方法。如果你想要,用上面的结构就可以轻松搞定。
传递用户有点棘手。
您可以使用路由,或设置会话。
我会亲自设置一个会话(它更干净):
#app/controllers/requests_controller.rb
class RequestsController < ApplicationController
def show
session[:user_id] = @user.id #-> I don't know how you populate @user
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) %>
--
如果您使用 Devise,用户对象应该在 current_user
object 中可用(这意味着您不必设置 session[:user_id]
):
#app/controllers/answers_controller.rb
class AnswersController < ApplicationController
def new
## current_user available here if using devise
end
end
要将 @user
分配给新的 answer
记录,只需在 answers#create
:
#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
像这样的东西对我有用:
- 我有两个模型(Formula 和 FormulaMaterial)
- Formula has_many FormulaMaterials,属于Formula
我的公式控制器像这样设置@formula:
@formula = Formula.find(参数[:id])
我在我的公式 show.html.erb 中列出我的公式材料,方法是在我的公式控制器中声明它,如下所示:
@formula_materials = FormulaMaterial.where(: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" %>
在 "new_..._path" 中,我将关联的 id 设置为 @formula 变量。当它传递到我的 FormulaMaterial 的 new.html.erb 时,我的 URL 看起来像这样:
在我的 FormulaMaterial new.html.erb 文件中,我创建了一个 hidden_field,它通过使用 "params" 访问 formula_id 来设置关联值在 URL 中像这样:
参数[:formula_id] %>
我不确定这是否是最好的方法,但这种方法让我每次都能将前一页的视图 ID 作为表单中的隐藏、关联和设置字段传递。
希望对您有所帮助!