我的应用程序包含资源Users
和Articles
。在网址localhost/users/1
上,我收到了用户1的所有文章。在网址localhost/users/2
上,我收到了用户2等所有文章。在这些网址上我还有编辑/删除/的功能为给定的User
添加文章。例如,如果我edit
第2条localhost/articles/2/edit
,则此类网址就是这样。因此,它不会发送User
ID,而只会发送Article
ID。
现在我希望能够为给定用户添加/删除/编辑文章,这样在完成此操作后,我将重定向回到此用户文章的列表。因此,如果我修改/更新/删除并点击localhost/users/1
,我希望重定向到网址Save
。
所以我有以下一系列行动:
1)转到指定的用户网址(网址转到:localhost/users/1
)
2)为此用户编辑文章2(网址转到:localhost/articles/2/edit
)
3)点击保存(我现在想要网址带我回到:localhost/users/1
)
Show
的{{1}}控制器工作正常。
User
def show
@user = User.find(params[:id])
@articles = Article.all
end
我的Update
控制器,我无法确定。
Article
所以这显然不起作用。有什么建议吗?
更新:def update
# I want something like this to find the user, How do I access the user from which the action is going
#@user = User.find(params[:id])
@article = Article.find(params[:id])
if @article.update_attributes(allowed_params)
#redirect_to user_path(@user)
else
render "new"
end
end
用户视图。
Show
答案 0 :(得分:0)
您只需redirect :back
即可访问该用户所使用的任何网页:
redirect_to :back
所以你最终得到了这个:
def update
@article = Article.find(params[:id])
if @article.update_attributes(allowed_params)
redirect_to :back
else
render "new"
end
end
答案 1 :(得分:0)
按照你的顺序:
1)使用路线/users/:id
,您应该能够访问单个用户而不是给定用户的文章。如果你想获得后者,你最好使用/users/:user_id/articles
。
2)如果您想对给定用户的文章执行操作,请说要对其进行编辑,其REST路由为/users/:user_id/articles/:id/edit
在routes.rb
中定义这些路由非常简单,因为他们遵循REST约定:
resources :users do
resources :articles
end
你的模特:
class User < ActiveRecord::Base
has_many :articles
end
class Article < ActiveRecord::Base
belongs_to :user
end
因此,在index
控制器的Articles
操作中,您将能够获取给定用户的所有文章:
def index
@user = User.find(params[:user_id])
@articles = @user.articles
end
如果您想更新给定用户的单篇文章:
def update
@user = User.find(params[:user_id])
@article = Article.find(params[:id])
if @article.update_attributes(allowed_params)
redirect_to user_path(@user)
else
render "new"
end
end
答案 2 :(得分:0)
您需要名为nested resources的内容:
#config/routes.rb
resources :users do
resources :articles #-> url.com/users/:user_id/articles/:id
end
-
这将为您creating/reading/updating/destroying
下的articles
user
提供一组嵌套路由。
正如zoro
的答案所述,您需要确保articles
与users
#app/models/user.rb
class User < ActiveRecord::Base
has_many :articles
end
#app/models/article.rb
class Article < ActiveRecord::Base
belongs_to :user
end
{{}}}关联:
@article
这样,每个@article.user
都会有一个#app/controllers/articles_controller.rb
class ArticlesController < ApplicationController
before_action :set_user
def index
@articles = @user.articles
end
def edit
@article = @user ? @user.articles.find(params[:id]) : Article.find(params[:id])
end
def update
@article = @user ? @user.articles.find(params[:id]) : Article.find(params[:id])
redirect_to user_articles_path(@user) if @article.update article_params
end
private
def article_params
params.require(:article).permit(......)
end
def set_user
@user = User.find params[:user_id] if params[:user_id] #-> allows you to use this without nesting
end
end
关联对象,可以使用以下方法调用它:
#app/views/articles/index.html.erb
<% if @articles %>
<% @articles.each do |article| %>
<%= article.title %>
<% end %>
<% end %>
视图如下:
{{1}}
答案 3 :(得分:0)
如果您在每篇文章中都有user_id
参数,则只需添加以下内容:
def update
@article = Article.find(params[:id])
if @article.update_attributes(allowed_params)
redirect_to user_path(@article.user)
else
render "new"
end
end
如果您的文章中没有user_id
参数。请添加:
def update
@article = Article.find(params[:id])
@article.user_id = current_user.id
if @article.update_attributes(allowed_params)
redirect_to user_path(@article.user)
else
render "new"
end
end
或
def update
@article = Article.find(params[:id])
@article.user_id = allowed_params[:user_id]
if @article.update_attributes(allowed_params)
redirect_to user_path(@article.user)
else
render "new"
end
end
或者您可以在表单中添加hidden_field来设置user_id
<%= f.hidden_field :user_id, current_user.id %>
我希望这可以帮到你