在Rails中传递URL中的参数

use*_*248 3 ruby-on-rails

我开始学习Rails,我正面临一个问题,我认为这个问题非常简单,但我找不到答案.

我有一个电影目录,索引页面显示它显示几个列,我需要将其中两个作为链接.此链接将再次重新显示索引页面,但按所选条件排序.

到目前为止,我只添加了一个链接如下:

%th= link_to 'Movie Title', root_path
Run Code Online (Sandbox Code Playgroud)

但是我无法发送URL参数,因此我可以在控制器中获取它并执行排序.实际控制器如下:

def index
  @movies = Movie.all
end
Run Code Online (Sandbox Code Playgroud)

我想,如果我能在控制器中获得一个参数,那么使用"if"语句就可以完成这项工作.我想象一个这样的URL,其中"1"表示按第一个标准排序:

http://www.mysite/1
Run Code Online (Sandbox Code Playgroud)

我看到了这样的解决方案,但我想这不是一个好的选择.请指教.

<%= link_to "Link Title", something__path(:param1 => "value1", :param2 => "value2") %>
Run Code Online (Sandbox Code Playgroud)

我将非常感谢有关如何修改视图和控制器的任何建议.我已经搜索了几个解决方案,但我很难理解解决方案.也许有更好的方法来实现这一目标.如果是这样,那么我准备好听.

尊敬的
Jorge Maldonado

drs*_*drs 6

主要问题

这归结为RESTful路径设计.它实际上取决于您尝试传递给控制器​​并在URL中表示的字段类型.

将路径视为资源的访问路径非常重要.

一般来说,有两种方法可以表示您想要的数据:

  • 作为路径变量:这些形式是/path/to/resource/:resourceId.使用此格式表示资源本身的属性.
    • 例如,博客上的帖子的ID是博客资源的属性.
  • 作为查询参数:这些的形式是/path/to/resource?queryKey=queryVal.将此格式用于数据的元数据和操作.
    • 例如,您对博客帖子进行排序的方式不是博客帖子本身的属性,而只是您在其上执行的操作.

机械学

你最初的猜测实际上非常接近.你想要的是这样的东西:

在你的控制器中:

movie = Movie.find(params[:id])
Run Code Online (Sandbox Code Playgroud)

在你看来:

<%= link_to 'View Movie', movie %>
Run Code Online (Sandbox Code Playgroud)

在引擎盖下,Rails正在执行一些魔术,将其变成看起来与问题中的代码非常相似的东西.最好让Rails自己执行这个魔法,因为它可以让以后更容易改变.

另外,为了清楚起见,使用路径变量(而不是查询参数)是适合您情况的最佳方法.您可以在此处的文档中阅读有关路由的更多信息:http: //guides.rubyonrails.org/routing.html

后续问题

回答这个问题(我还没有足够的回复评论):

感谢您的回复.它工作正常.我还有一个问题.这样的链接是什么意思?最后一个参数(:id)用于什么?link_to "Movie Title", movies_path(:sort => "title"), :id => "title_header"

link_to标记上,向生成的HTML标记:id添加id字段.

这个: link_to "Articles", articles_path, id: "news", class: "article"

产生: <a href="/articles" class="article" id="news">Articles</a>

请参阅此处的Rails文档:http: //apidock.com/rails/ActionView/Helpers/UrlHelper/link_to
(搜索"CSS的类和ID很容易生成:")


小智 0

您可以做的就是添加上面提到的参数。比在你的控制器中你可以做的

def index 
if params[:param_1] == "param_one"
@movies = Movie.where(id: 'param_one')
else
@movies = Movie.all
end
end
Run Code Online (Sandbox Code Playgroud)

您的解决方案可能像这样 =link_to 'xxx', movie_path(:param_one=> "p1", :param_two=>"p2") 将调用 movie_controller.rb 的索引操作。