Ruby on Rails:参数传递

时间:2015-11-14 19:27:32

标签: ruby-on-rails rest model-view-controller

我的应用程序包含资源UsersArticles。在网址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

4 个答案:

答案 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的答案所述,您需要确保articlesusers #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 %>

我希望这可以帮到你